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"
La solution mentionnée dans la question résout le problème:
Android:focusable="false"
Android:focusableInTouchMode="false"
Utilisez cette ligne dans la vue racine de l'élément de liste
Android: descendantFocusability = "blocksDescendants"
J'ai mal compris votre problème ..jetez un œil icipour votre problème .. espérons que cela résoudra votre problème ..