【问题标题】:Check box selection and list item click on the same listview in android复选框选择和列表项单击android中的相同列表视图
【发布时间】:2014-09-09 05:17:52
【问题描述】:

我已经在 android listview 的单选模式下实现了一个带有复选框的自定义列表视图。我想要一个功能,当我点击复选框时,必须添加与该复选框对应的行(或者说“人“该行中显示的对象应该被添加到另一个列表并从该列表中删除)并且在该列表视图上的 itemclick 应该将我带到 android 中的另一个屏幕。我尝试了其他方式,但他们指定复选框需要是可聚焦的:错误。另外我希望点击侦听器仅在复选框上工作。请对此提出任何建议或帮助。提前致谢

这个 id 是 xml 代码。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <CheckBox
        android:id="@+id/projects_check"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_marginBottom="5dp"
        android:layout_marginLeft="5dp"
        android:layout_marginStart="5dp"
        android:layout_marginTop="5dp"
        android:focusable="false" />

    <TextView
        android:id="@+id/project_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/projects_check"
        android:layout_alignBottom="@+id/projects_check"
        android:layout_marginLeft="10dp"
        android:layout_marginStart="10dp"
        android:layout_toEndOf="@+id/projects_check"
        android:layout_toRightOf="@+id/projects_check"
        android:text="TextView" />

</RelativeLayout>

这是我的 onitem 点击监听代码..

@Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long arg3) {
        Projects info = (Projects) parent.getItemAtPosition(position);
        info.toggleChecked();
        ProjectsHolder viewHolder = (ProjectsHolder) view.getTag();
        viewHolder.getmChoiceSelect().setChecked(info.isChecked());
        if (viewHolder.getmChoiceSelect().isChecked()) {
            completed_projects.add(info);
            mCompProjAdapter.notifyDataSetChanged();
            projects_list.remove(info);
            mProjAdapter.notifyDataSetChanged();
        }
    }

【问题讨论】:

  • 建议使用自定义适配器并在那里处理复选框和文本视图的单击事件,而不是 setOnItemClickListener 用于列表视图
  • 但是由于复选框是在自定义适配器中实现的,因此如何才能将复选框单击到片段中
  • 您必须在自定义适配器中编写复选框和文本框的点击事件。

标签: android android-listview onitemclicklistener


【解决方案1】:

要管理对行本身的点击,您可以为 listView 本身编写监听器。 这就是我管理复选框单击的方式。

 class CustomAdapter extends ArrayAdapter<BeanClass> {

            private ArrayList<BeanClass> items;

            public FieldPlannedAdapter(Context context,
                    ArrayList<BeanClass> items) {
                super(context, R.layout.custom_list_row, items);

                this.items = items;
            }

            public class ViewHolder {

                protected CheckBox checkbox;
                protected TextView name;

            }

            @Override
            public View getView(final int position, View convertView,
                    ViewGroup parent) {

                final ViewHolder viewHolder;

                if (convertView == null) {

                    LayoutInflater inflater = (LayoutInflater) getActivity()
                            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    convertView = inflater.inflate(R.layout.custom_list_row,
                            null);
                    viewHolder = new ViewHolder();
                    viewHolder.checkbox = (CheckBox) convertView
                            .findViewById(R.id.checkIsMissed);

                    viewHolder.name = (TextView) convertView
                            .findViewById(R.id.txtViewMTPname);


                    convertView.setTag(viewHolder);


                    viewHolder.checkbox
                            .setOnClickListener(new View.OnClickListener() {
                                public void onClick(View v) {
                                    final CheckBox cb = (CheckBox) v;
                                    final BeanClass item = (BeanClass) cb
                                            .getTag();

                                    item.setSelected(cb.isChecked());


                                    if (cb.isChecked()) {
                                        // DO SOMETHING

                                    } else {

                                    }



                                }
                            });


                } else {
                    viewHolder = (ViewHolder) convertView.getTag();
                }

                BeanClass item = items.get(position);
                viewHolder.name.setTag(item);

                viewHolder.checkbox.setTag(item);


                viewHolder.name.setText(item.getName());

                viewHolder.checkbox.setChecked(item.isSelected());

                if (viewHolder.checkbox.isChecked()) {
                    // DO SOMETHING

                } else {
                    // DO SOMETHING
                }

                return convertView;
            }
        }

自定义行示例:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp" >

    <LinearLayout
        android:id="@+id/row"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/card_ui"
        android:descendantFocusability="blocksDescendants"
        android:orientation="vertical"
        android:paddingBottom="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:paddingTop="10dp" >

        <TextView
            android:id="@+id/txtViewMTPname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Customer Name"
            android:textColor="@drawable/text_selector"
            android:textSize="14sp"
            android:textStyle="bold" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal" >

            <TextView
                android:id="@+id/txtViewMtpDarCity"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="2"
                android:text="dgdgdgdg"
                android:textColor="@drawable/text_selector"
                android:textSize="16sp"
                android:textStyle="italic" />

            <CheckBox
                android:id="@+id/checkIsMissed"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="5dp"
                android:gravity="center"
                android:text="Missed" />


        </LinearLayout>
    </LinearLayout>

</FrameLayout>

【讨论】:

  • 我试过这样做,但是在完成你的过程之后,复选框仍然是列表行的一部分,所以我无法实现 onitem 点击监听器
  • onItemClick监听器需要在listview上实现,在onCreate中
  • 是的,我已经在包含列表视图的片段类中做到了这一点,但是由于列表行是自定义的,因此复选框位于前台,我无法单击除复选框之外的任何内容。你能请同时添加 onitem 点击代码。简单的解释会很好,例如:在项目点击时显示敬酒。在此先感谢
  • 我问你是因为我实现了 onitem 点击监听器但仍然无法获得点击
  • 我将添加一个行示例。尝试据此调整布局,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2013-11-09
  • 2013-08-03
  • 2015-02-24
  • 1970-01-01
  • 2016-02-03
相关资源
最近更新 更多