Получить щелчок по элементу из списка

У меня проблема. До внесения изменений в мой XML файл мой список мог работать отлично. Но теперь, после некоторых изменений в xml, он не работает должным образом. Мой список - это обычай. Итак, я создал отдельный xml для рендеринга каждой отдельной строки в списке.

Мой единственный код row.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:id="@+id/relativeLayoutSingleRowManageAddictions"
    android:layout_height="40dp"
    android:background="@drawable/box_midbg" >

    <TextView
        android:id="@+id/textViewSingleRowManageAddictions"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="17dp"
        android:text="TextView"
        android:textSize="20dp"
        android:textColor="#ffffff" />

    <ImageView
        android:id="@+id/imageViewSingleRowManageAddictions"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="18dp"
        android:src="@drawable/listing_arrow" />

</RelativeLayout>

Мой main.xml код, в котором находится listview:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/main_bg_edited" >

    <RelativeLayout
        android:id="@+id/relativeLayout1"
        style="@style/top_bar_style" >

        <ImageView
            android:id="@+id/imageViewMAnageAddictionsBack"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:src="@drawable/back_arrow"
            android:clickable="true" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@style/header_style"
            android:text="Manage Addictions" />

        <ImageView
            android:id="@+id/imageViewManageAddictionsAdd"
            android:layout_width="25dp"
            android:layout_height="20dp"
            android:layout_marginRight="3dp"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:src="@drawable/plus_nav"
            android:clickable="true" />

    </RelativeLayout>

    <ListView
        android:id="@+id/listViewManageAddictions"
        android:layout_width="290dp"
        android:layout_height="fill_parent"
        android:layout_below="@+id/relativeLayout1"
        android:layout_centerHorizontal="true"
        android:layout_centerInParent="true"
        android:layout_marginTop="12dp"
        android:divider="@android:color/transparent"
        android:dividerHeight="2dp" />

</RelativeLayout>

И мой код Java для него:

package com.addictioncounterapp;

import java.util.ArrayList;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class ManageAddictionList extends Activity {
  ImageView iv_manage_addictions_back, iv_manage_addictions_add;
  ListView listview;
  ArrayList < String > arraylist_manage_addiction;
  ArrayAdapter < String > arrayadapter_manage_addiction;
  SQLiteDatabase database;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_manage_addiction_list);

    loaddatabase();

    iv_manage_addictions_back = (ImageView) findViewById(R.id.imageViewMAnageAddictionsBack);
    iv_manage_addictions_back.setClickable(true);
    iv_manage_addictions_back.setOnClickListener(new OnClickListener() {@Override
      public void onClick(View v) {
        startActivity(new Intent(ManageAddictionList.this, Settings.class));
      }
    });

    iv_manage_addictions_add = (ImageView) findViewById(R.id.imageViewManageAddictionsAdd);
    iv_manage_addictions_add.setClickable(true);
    iv_manage_addictions_add.setOnClickListener(new OnClickListener() {@Override
      public void onClick(View v) {
        Intent intent = new Intent(ManageAddictionList.this, MainActivity.class);
        intent.putExtra("name", "");
        intent.putExtra("unit", "");
        intent.putExtra("attribute", "");
        intent.putExtra("limit", "");
        intent.putExtra("operation", "Add Addiction");
        startActivity(intent);
      }
    });


    arraylist_manage_addiction = new ArrayList < String > ();
    manageList();
    listview = (ListView) findViewById(R.id.listViewManageAddictions);

    if (arraylist_manage_addiction.isEmpty()) Toast.makeText(getBaseContext(), "No Addictions found to manage. Click on 'add' button to create new Addiction.", Toast.LENGTH_SHORT)
      .show();
    else listview.setAdapter(arrayadapter_manage_addiction);

    listview.setOnItemClickListener(new OnItemClickListener() {@Override
      public void onItemClick(AdapterView <? > arg0, View arg1, int arg2, long arg3) {
        String name = null, attribute = null, unit = null, limit = null;

        View parentView = (View) arg0.getParent();
        name = ((TextView) parentView.findViewById(R.id.textViewSingleRowManageAddictions))
          .getText() + "";

        Toast.makeText(getBaseContext(), name, Toast.LENGTH_SHORT)
          .show();

        int cat_id = 0;

        //--------Fetching cat_id through name from the list--------

        Cursor cursor;

        cursor = database.query("category", new String[] {
          "cat_id"
        }, new String("cat_name=?"), new String[] {
          name
        }, null, null, null);

        if (cursor.getCount() > 0) {
          while (cursor.moveToNext())
          cat_id = cursor.getInt(0);
          cursor.close();
        }

        //--------Fetching unit, attribute, limit through cat_id from the list--------

        cursor = database.query("category_attribute", new String[] {
          "cat_attribute_name", "cat_attribute_unit", "cat_limit"
        }, new String("cat_id=?"), new String[] {
          cat_id + ""
        }, null, null, null);

        if (cursor.getCount() > 0) {
          while (cursor.moveToNext()) {
            attribute = cursor.getString(0);
            unit = cursor.getString(1);
            limit = cursor.getString(2);
          }
          cursor.close();
        }

        Intent intent = new Intent(ManageAddictionList.this, MainActivity.class);
        intent.putExtra("name", name);
        intent.putExtra("unit", unit);
        intent.putExtra("attribute", attribute);
        intent.putExtra("limit", limit);
        intent.putExtra("cat_id", cat_id);
        intent.putExtra("operation", "Edit Addiction");
        startActivity(intent);
      }
    });
  }

  private void loaddatabase() {
    database = openOrCreateDatabase("AddictionCounter.db", SQLiteDatabase.OPEN_READONLY, null);
  }

  private void manageList() {
    String[] columns = {
      "cat_name"
    };
    Cursor cursor;

    cursor = database.query("category", columns, null, null, null, null, null);

    if (cursor.getCount() > 0) {
      while (cursor.moveToNext())
      arraylist_manage_addiction.add(cursor.getString(0));
      cursor.close();
    }

    arrayadapter_manage_addiction = new ArrayAdapter < String > (this, R.layout.single_row_manage_addictions, R.id.textViewSingleRowManageAddictions, arraylist_manage_addiction);
  }
}

Основная ошибка в том, что, когда я получаю имя, используя это:

View parentView = (View) arg0.getParent();
name = ((TextView) parentView.findViewById(R.id.textViewSingleRowManageAddictions)).getText()+"";

список всех записей, он дает имя только первой записи. Например, если моя первая строка имеет текстовое представление с именем "Gaming", когда я нажимаю на любую строку (для цели отладки я использовал Toast.makeText(...)) it Toasts "Gaming" как имя для каждой записи в listview, хотя каждая запись в списке уникальна. Пожалуйста, помогите мне с этим.

Ответ 1

lv.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        // selected item
        String selected = ((TextView) view.findViewById(R.id.your_textView_item_id)).getText().toString();

        Toast toast = Toast.makeText(getApplicationContext(), selected, Toast.LENGTH_SHORT);
        toast.show();
    }
});

Ответ 2

listView = (ListView)view.findViewById(R.id.list);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String selected = ((TextView) view.findViewById(R.id.complaint)).getText().toString();
        Toast.makeText(context,selected,Toast.LENGTH_LONG).show();
    }
});

Ответ 3

Если вы хотите onClickListener только в TextView, лучше определить onClickListener в самом адаптере. как

yourTextView.setOnClickListener(new View.OnClickListener() {
      public void onClick(View v) {
        // showToast()
      }
});

Ответ 4

Помимо вышеупомянутого решения, это сработало для меня, я столкнулся с аналогичной ситуацией, я смог решить ее после того, как добавил следующие

android:descendantFocusability="blocksDescendants"

для моего списка в xml. Он работает сейчас. Для настоящего любопытного пользователя здесь больше информации об этом http://developer.android.com/reference/android/R.attr.html#descendantFocusability

Ответ 5

Потому что у меня недостаточно репутации для комментариев. Здесь я комментирую ваш вопрос по ответу SKK. Просто добавьте инструкцию if к вашему и выполните разные действия...

lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    // selected item
    String selected = ((TextView) view.findViewById(R.id.your_textView_item_id)).getText().toString();

    if(selected.equals("Your comparing string, like Games"){                                               

    Toast toast = Toast.makeText(getApplicationContext(), selected, Toast.LENGTH_SHORT);
    toast.show(); }                                                                                                                 

    else {                                            
    if(selected.equals("Your comparing string, like Games")){                                            
    Toast toast = Toast.makeText(getApplicationContext(), selected, Toast.LENGTH_SHORT);
    toast.show();}}


}});