带有复选框和所有可点击的Android ListView [重复]

Posted

技术标签:

【中文标题】带有复选框和所有可点击的Android ListView [重复]【英文标题】:Android ListView with Checkbox and all clickable [duplicate] 【发布时间】:2011-07-22 00:00:37 【问题描述】:

可能重复:android: Binding data from a database to a CheckBox in a ListView?

我想将 ListView 与具有以下布局的项目一起使用

------------------------- 
 [CB]    TV            TV
-------------------------

CB 是一个复选框,TV 是一个 Textview。

现在我在某处读到,ListView 中不能有可点击的项目。如果您有一些,那么您将无法单击 ListItems。 但如果我查看 GoogleMail 应用程序,这是可能的。我可以用复选框标记多条消息(然后为它们选择一个操作),或者我可以单击 ListItem(或使用 dpad 滚动)以进入另一个屏幕。 有人有代码/示例这是怎么可能的?

【问题讨论】:

我没有代码 atm 但有可能,因为移动、拖动、单击和 longClick 不是同一个事件。并且复选框的命中框也在列表视图的顶部。 看代码here可以在listview中选择多个项目。检查here 带有文本和图像示例:here 这个问题不是重复的。另一个问题是关于如何使 CursorAdapter 将正确的 db 列绑定到特定视图。这个问题根本不是关于绑定数据,而是关于如何在 ListView 中使复选框可点击。 这不是重复的...这是关于 ListView + CheckBox,.. 而不是数据绑定!愚蠢的版主...!!!! 【参考方案1】:

下面的代码会帮助你:

public class DeckListAdapter extends BaseAdapter

      private LayoutInflater mInflater;
        ArrayList<String> teams=new ArrayList<String>();
        ArrayList<Integer> teamcolor=new ArrayList<Integer>();


        public DeckListAdapter(Context context) 
            // Cache the LayoutInflate to avoid asking for a new one each time.
            mInflater = LayoutInflater.from(context);

            teams.add("Upload");
            teams.add("Download");
            teams.add("Device Browser");
            teams.add("FTP Browser");
            teams.add("Options");

            teamcolor.add(Color.WHITE);
            teamcolor.add(Color.LTGRAY);
            teamcolor.add(Color.WHITE);
            teamcolor.add(Color.LTGRAY);
            teamcolor.add(Color.WHITE);


        



        public int getCount() 
            return teams.size();
        


        public Object getItem(int position) 
            return position;
        


        public long getItemId(int position) 
            return position;
        

       @Override
        public View getView(final int position, View convertView, ViewGroup parent) 
            final ViewHolder holder;


            if (convertView == null) 
                convertView = mInflater.inflate(R.layout.decklist, null);

                holder = new ViewHolder();
                holder.icon = (ImageView) convertView.findViewById(R.id.deckarrow);
                holder.text = (TextView) convertView.findViewById(R.id.textname);

             .......here you can use holder.text.setonclicklistner(new View.onclick.

                        for each textview


                System.out.println(holder.text.getText().toString());

                convertView.setTag(holder);
             else 

                holder = (ViewHolder) convertView.getTag();
            



             holder.text.setText(teams.get(position));

             if(position<teamcolor.size())
             holder.text.setBackgroundColor(teamcolor.get(position));

             holder.icon.setImageResource(R.drawable.arraocha);







            return convertView;
        

        class ViewHolder 
            ImageView icon;
            TextView text;



        

希望这会有所帮助。

【讨论】:

【参考方案2】:

在您的 XML 布局中将 CheckBox 设置为 focusable="false"。否则它将从列表视图中窃取点击事件。

当然,如果您这样做,您需要手动处理将 CheckBox 标记为选中/未选中(如果单击列表项而不是 CheckBox),但无论如何您可能都希望这样做。

【讨论】:

谢谢,这对我有用;) 为复选框设置 focusable="false" 允许我单击列表视图项目,但这并不能阻止我单击复选框本身。为此,我还需要为复选框设置 clickable="false"。 如何允许在列表视图android的项目点击上窃取点击复选框? 我尝试设置 recyclerview 的 focausable = "false" 复选框。它工作正常,我可以单击列表项。但是当我尝试在复选框上添加 checkedChangeLsener 时,它阻止了列表项。现在无法单击列表项。 @太平洋天空【参考方案3】:

此代码适用于我的项目,我可以选择列表视图项和复选框

<?xml version="1.0" encoding="utf-8"?>
<!-- Single List Item Design -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:clickable="true" >

    <TextView
        android:id="@+id/label"
        android:layout_
        android:layout_
        android:layout_weight="4" />

    <CheckBox
        android:id="@+id/check"
        android:layout_
        android:layout_
        android:layout_weight="1"
        android:focusable="false"
        android:text="" >
    </CheckBox>

</LinearLayout>

【讨论】:

【参考方案4】:
holder.checkbox.setTag(row_id);

holder.checkbox.setOnClickListener( new OnClickListener() 

                @Override
                public void onClick(View v) 
                    CheckBox c = (CheckBox) v;

                    int row_id = (Integer) v.getTag();

                    checkboxes.put(row_id, c.isChecked());


                
        );

【讨论】:

【参考方案5】:

将列表视图适配器设置为“simple_list_item_multiple_choice”

ArrayAdapter<String> adapter;

List<String> values; // put values in this

//Put in listview
adapter = new ArrayAdapter<UserProfile>(
this,
android.R.layout.simple_list_item_multiple_choice, 
values);
setListAdapter(adapter);    

【讨论】:

那些内置的布局只有在你想要一个简单的布局时才有用。他表明他想做一个带有 2 个文本视图的复选框。

以上是关于带有复选框和所有可点击的Android ListView [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中检测禁用复选框上的触摸事件

MFC - 带有可选复选框的 CListCtrl 行

带有提示和图像的 Android 可点击 TextView 以启动搜索对话框并显示所选结果

Listitem 点击不适用于复选框 Android

带有 ListView 的 Android 可点击小部件在 ListItems 上不可点击

如何使整行列表视图可点击?