web-dev-qa-db-fra.com

obtenir l'élément cliqué de listview

J'ai un problème. Avant la modification dans mon fichier XML, mon listview était capable de fonctionner parfaitement. Mais maintenant, après quelques modifications au format XML, cela ne fonctionne pas correctement. Ma listview est personnalisée. J'ai donc créé un fichier XML distinct pour rendre chaque ligne de la liste.

Mon single row.xml code:

<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>

Mon main.xml code où réside 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>

Et mon code Java pour cela:

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);
  }
}

Le bogue principal derrière ceci est que, quand je reçois le nom en utilisant ceci:

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

la liste des enregistrements, elle ne donne que le nom du premier enregistrement. Par exemple, si ma première ligne a textview nommée "Gaming", lorsque je clique sur une ligne, (à des fins de débogage, j’ai utilisé Toast.makeText(...)) it Toasts "Gaming" comme nom de chaque enregistrement de la liste, bien que chaque enregistrer dans la liste de diffusion est unique. Aidez-moi, s'il vous plaît.

10
Chintan Soni
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();
    }
});
48
SKK
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
Shah

Si vous voulez onClickListener sur la TextView uniquement, il est préférable de définir onClickListener dans l'adaptateur même. comme 

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

En dehors de la solution ci-dessus, cela a fonctionné pour moi. Je faisais face à une situation similaire. J'ai pu la résoudre après avoir ajouté ce qui suit. 

Android:descendantFocusability="blocksDescendants"

à ma listview en xml. Il fonctionne maintenant. Pour les vrais utilisateurs curieux, voici plus d'informations à ce sujet http://developer.Android.com/reference/Android/R.attr.html#descendantFocusability

1
war_Hero

Parce que je n'ai pas assez de réputation pour commenter Ici, je commente votre question sur la réponse de SKK. Ajoutez simplement une déclaration si à votre et effectuez différentes actions ... 

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();}}


}});                                                   
0
Mudassir