2013-02-03 6 views
2

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

+1

Pourquoi avez-vous ajouté Android: cliquable = false pour votre textview? –

+0

Avez-vous essayé de déboguer votre code et d'avoir vérifié l'existence d'un problème? – GrIsHu

+0

@Puru n'a même pas d'importance si je l'ai activé donc laissé désactivé –

Répondre

0

Ok, je viens de tester le code, je l'ai édité un peu et maintenant ça marche.

Ce que j'ai changé:

if(l != null) { 
    TextView title = (TextView) v; // insted of findView 

    title.setText(l.getTitle()); 
    title.setCompoundDrawablesWithIntrinsicBounds(l.getImageId(), 0, 0, 0); 
} 
+0

Juste appliqué les changements moi-même et je n'ai toujours rien sur OnItemClick d'autres changements importants que vous avez faits? –

+0

Etes-vous sûr que vous définissez ContentView à un certain moment dans votre méthode onCreate appel –

+0

Oui, je suis positif le CustomAdapter affiche correctement toutes les lignes de la liste ils ne sont tout simplement pas cliquables J'ai juste essayé de mettre setOnItemClickListener dans onStart() pour vous assurer mais toujours pas d'effet. –

0

essayer de changer l'activité d'étendre ListActivity .. Quelle est l'erreur dans le logcat?

+0

Je ne peux pas, je dois étendre cette activité dans la bibliothèque que j'utilise pour l'activité de base. L'auteur fournit un exemple et cela fonctionne bien pour lui, il utilise des fragments bien. https://github.com/jfeinstein10/SlidingMenu/tree/master/example/src/com/slidingmenu/example –

0

Etrangement, j'ai obtenu le mien de travailler quand j'ai supprimé les attributs traitant de la mise au point et la cliquabilité. Je ne comprends pas, mais voyez si cela fonctionne pour vous.

0

appliquer à la vue de l'enfant

android:focusable="false" 
android:focusableInTouchMode="false" 

Appliquer ce à la mise en page des parents

android:descendantFocusability="blocksDescendants" 

dans votre code ajouter ces deux lignes:

mSlidinglist.setClickable(true) 
mSlidinglist.setEnable(true) 
Questions connexes