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