web-dev-qa-db-fra.com

Listitem click ne fonctionne pas avec les cases à cocher Android

EDIT (RESOLU) Pour la réponse, allez au bas de la question.

J'ai une liste et j'y gonfle quelques lignes en utilisant un customadapter. La ligne en cours d'inflation contient une case à cocher. Je peux conserver le statut de la case à cocher, mais le problème est que mes éléments de liste ne sont plus cliquables. Voici mon code:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    fl=(ListView)findViewById(R.id.MainMenu);//Mainmenu is listview
    fl.setAdapter(new CustomAdapter(Annotate.this,R.layout.preann2,_dir));//preann2 is row and _dir is the list of objects
    //fl.setOnItemClickListener(this); tried this too
}

public void onItemClick(AdapterView<?> a, View view, int pos, long id) 
{
      //Implementations
}

    public class CustomAdapter extends ArrayAdapter<String>
{
    public CustomAdapter(Context context, int textViewResourceId,String[] objects) {
        super(context, textViewResourceId,objects);
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater=getLayoutInflater();
            View row=inflater.inflate(R.layout.preann2, parent, false);
            try
            {

            TextView Name=(TextView)row.findViewById(R.id.title);
            Name.setText("xyz");
            ImageView icon=(ImageView)row.findViewById(R.id.icon);
            row.setFocusable(true);
            row.setClickable(true);
            row.setOnClickListener(new OnClickListener(){

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    checkState[position]=!checkState[position];
                }

            });
            CheckBox c=(CheckBox)row.findViewById(R.id.checkBox);
            c.setChecked(checkState[position]);
            c.setOnCheckedChangeListener(new OnCheckedChangeListener(){

                @Override
                public void onCheckedChanged(CompoundButton v,
                        boolean isChecked) {
                    // TODO Auto-generated method stub
                    CheckBox checkBox=(CheckBox)v;
                    if (isChecked) {
                        checkState[position]=true;
                     }
                    else
                        checkState[position]=false;
                }
            });
            /*  tried this too
                                  c.setOnClickListener(new OnClickListener(){

                @Override
                public void onClick(View v) {
                    CheckBox checkBox=(CheckBox)v;
                    if (checkBox.isChecked()) {
                        //checkBox.setChecked(false);
                        checkState[position]=true;
                     }
                    else
                        checkState[position]=false;
                }});*/
            icon.setImageResource(R.drawable.ic_launcher);
            }catch(Throwable err)
            {
                err.printStackTrace();
            }
            return row;
        }
}

Je veux que la liste soit cliquable au cas où l'utilisateur voudrait cliquer sur un seul élément.

EDIT (à la demande d'Akhil) - Preann2.xml dans le dossier Layouts:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:layout_width="fill_parent"
  Android:layout_height="wrap_content"
  Android:orientation="horizontal"
  Android:padding="4dip"
  >

 <ImageView Android:id="@+id/icon"
Android:layout_width="wrap_content"
Android:layout_height="fill_parent"
Android:layout_alignParentTop="true"
Android:layout_alignParentBottom="true"
Android:layout_marginRight="4dip"/>


  <TextView
  Android:id="@+id/title"
  Android:layout_width="fill_parent"
  Android:layout_height="match_parent"
  Android:layout_weight="1"
  Android:ellipsize="end"
  Android:gravity="center_vertical"
  Android:singleLine="true"
  Android:textStyle="bold" />

<CheckBox
  Android:id="@+id/checkBox"
  Android:layout_width="wrap_content"
  Android:layout_height="wrap_content" />

</LinearLayout>

main.xml dans le dossier layouts:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical" >


<ListView
    Android:id="@+id/MainMenu"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

</ListView>

</LinearLayout>

EDIT (RESOLU) Ajoutez simplement ces propriétés à la case à cocher:

  Android:focusable="false"
  Android:focusableInTouchMode="false"
32
silentkratos
17
Heath Borders

Utilisez cette ligne dans la vue racine de l'élément de liste
Android: descendantFocusability = "blocksDescendants"

5
Suresh kumar

J'ai mal compris votre problème ..jetez un œil icipour votre problème .. espérons que cela résoudra votre problème .. 

0
Akhil