Android复选框中的列表项单击无法正常工作

33

编辑(已解决) 答案在问题底部。

我有一个列表视图,并使用自定义适配器填充其中的一些行。 被填充的行包含一个复选框。我可以维护复选框的状态,但问题是,我的列表项不再可点击。 这是我的代码:

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;
        }
}
我希望列表项能够可点击,以便用户只想单击一个项目时可以这样做。

编辑(应Akhil要求)-在布局文件夹中的preann2.xml:

<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:

<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 (SOLVED) 只需在复选框中添加这些属性:

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

1
如果您希望在单击行时选中复选框,则应将条件与行本身的onClickListener()一起使用。 - Karthik Balakrishnan
我解决了。 只需要将复选框的focusable和focusonTouchMode属性设置为false即可。谢谢Eitherways。 - silentkratos
2
请在两天后回答并接受您自己的问题。可能会帮助其他人。 - Karthik Balakrishnan
现在只需编辑您的问题并在其中包含解决方案即可。 - Karthik Balakrishnan
可能是带复选框的列表项不可点击的重复问题。 - avalancha
显示剩余4条评论
3个回答

17

6
在列表项的根视图中使用此行:
android:descendantFocusability="blocksDescendants"
该属性可以防止列表项子视图获取焦点,从而确保整个列表项可以响应点击事件。

0

我已经做了同样的事情。TextView、图标和复选框在一个布局中。主菜单ListView在另一个布局中。 - silentkratos
我明白了,但是我想说的是,在你的ListItem布局中,将TextView和Icon放在同一个布局中,并以与Checkbox相同的方式在该布局上设置监听器。 - Akhil
我已经将布局共享为编辑。你能给我展示一下吗?拜托了? - silentkratos
我解决了。 只需要将复选框的focusable和focusonTouchMode属性设置为false即可。 无论如何,谢谢。 - silentkratos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接