Ok, je me suis arraché les cheveux ces dernières heures en essayant de comprendre pourquoi mon adaptateur listview personnalisé ne peut pas fonctionner correctement avec OnItemClickListener. J'ai un TextView où j'utilise l'attribut DrawableLeft pour dessiner une image à gauche d'une vue de texte dans un ListView. Maintenant, dans mon textview je mets le android: focusable et android: focusableInTouchMode ainsi que l'android: cliquable tout à faux et dans la racine de ma listview je mets l'android: descendantFocusability à blocksDescendants car ce sont des problèmes communs rencontrés avec ce numéro exact . Maintenant, voici les fichiers de mise en page, je vais avec:ListView Custom OnItemClickListener n'est pas appelé
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/menu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#363636"
android:dividerHeight="1dp"
android:divider="@drawable/menudivider"
android:paddingLeft="@dimen/list_padding"
android:paddingRight="@dimen/list_padding"
android:descendantFocusability="blocksDescendants" />
Ceci est mon TextView Mise en page:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/menu_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textColor="#fff"
android:typeface="sans"
android:textSize="20sp"
android:drawablePadding="10dp"
android:padding="7dp"
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false" />
I définir l'image DrawableLeft programme à l'intérieur de ma fonction getView dans ma classe dérivée de BaseAdapter. En ce qui concerne l'activité que je mets en œuvre la fonction OnItemClickListener en elle va un peu comme ceci:
public class ActivityBase extends Activity implements OnItemClickListener {
private ListView mSlidinglist = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSlidinglist = (ListView)findViewById(R.id.menu);
ArrayList<MenuItem> items = new ArrayList<MenuItem>();
items.add(new MenuItem("Test",R.drawable.test));
CustomAdapter adapter = new CustomAdapter(this,items);
mSlidinglist.setAdapter(adapter);
mSlidinglist.setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(this, "Clicked", Toast.LENGTH_LONG).show();
}
}
Voici mon adaptateur personnalisé:
public class CustomAdapter extends BaseAdapter
{
private ArrayList<MenuItem> items;
private Context mContext;
public CustomAdapter(Context context, ArrayList<MenuItem> items)
{
this.items = items;
this.mContext = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View v = convertView;
if(v == null) {
LayoutInflater vi = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.list_row, null);
}
final MenuItem l = items.get(position);
if(l != null) {
TextView title = (TextView) v.findViewById(R.id.menu_list);
title.setText(l.getTitle());
title.setCompoundDrawablesWithIntrinsicBounds(l.getImageId(), 0, 0, 0);
}
return v;
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
}
La classe MenuItem est juste setters et getters pour les champs dont j'ai besoin ...
Je ne comprends pas pourquoi tout aide est appréciée si plus de code est nécessaire laissez-moi k maintenant je ne voulais tout simplement pas poster tout. La sous-classe de BaseAdapter est très simple, elle définit simplement le texte des champs TextView et DrawableLeft en utilisant setCompoundDrawablesWithIntrinsicBounds. Si quelqu'un pouvait aider, ce serait grandement apprécié.
Pourquoi avez-vous ajouté Android: cliquable = false pour votre textview? –
Avez-vous essayé de déboguer votre code et d'avoir vérifié l'existence d'un problème? – GrIsHu
@Puru n'a même pas d'importance si je l'ai activé donc laissé désactivé –