Android如何使用复选框识别列表视图中的项目

Posted

技术标签:

【中文标题】Android如何使用复选框识别列表视图中的项目【英文标题】:Android how to identify item in listview with checkbox 【发布时间】:2012-03-15 16:40:49 【问题描述】:

我真的被困在这里了。我想要的并不简单(对我来说),但是我已经编程 android 一年了。 我想要的是一个列表视图,每行都有一个图像视图、一个文本视图、一个复选框和另一个文本视图。 让我们首先在布局中有一个文本视图和一个复选框。 基于this 教程,我设法做到了(有很多,但这似乎对我来说是最好的)。我有一个填充了文本视图和复选框的列表视图。

这是结果:

这就是我获得点击的 textview 文本的方式:

 textView.setOnClickListener(new View.OnClickListener() 

        @Override
        public void onClick(View v) 
            TextView tv = (TextView) v ;
            String text_of_clicked_textview = tv.getText().toString();
            Log.i("TAG", "" + text_of_clicked_textview);
        
    );

所以当我点击 Mercury 时,我会在 text_of_clicked_textview 变量中得到 Mercury

但是我如何检查我点击了哪个复选框?例如,我点击第三个复选框,我想现在它在地球的行中。如果我同时了解 listview 行中的 textview 文本(Earth)和项目编号(3),最好的办法是。

我想我必须在复选框上设置一个 onClickListener 但接下来呢?

checkBox.setOnClickListener( new View.OnClickListener() 
      public void onClick(View v) 
        CheckBox cb = (CheckBox) v ;

      
    );

【问题讨论】:

【参考方案1】:

这是 ListView 中自定义行的 XML:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_
        android:layout_>

        <ImageView
            android:id="@+id/imageView1"
            android:layout_
            android:layout_
            android:src="@drawable/camera_icon" />

        <TextView
            android:id="@+id/textView1"
            android:layout_
            android:layout_
            android:text="Large Text"
            android:textAppearance="?android:attr/textAppearanceLarge" />

        <CheckBox
            android:id="@+id/checkBox1"
            android:layout_
            android:layout_
            android:text="" 
     />

</LinearLayout>

这是实现列表的完整活动: 只需复制此活动进行测试,然后理解代码。在主Activity中放置一个listview

package com.DemoTest;

import java.util.ArrayList;
import java.util.List;
import java.util.zip.Inflater;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class CustomList extends Activity implements OnClickListener


    ListView listView;
    ArrayList<EachRow> list=new ArrayList<CustomList.EachRow>();
    EachRow each;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        String[] color="red","green","blue","white","yellow","cyan","purple","grey",
                "0red","0green","0blue","0white","0yellow","0cyan","0purple","0grey",
                "1red","1green","1blue","1white","1yellow","1cyan","1purple","1grey";
        for(String str : color)
        
            each=new EachRow();
            each.text=str;
            list.add(each);
        
        listView=(ListView)findViewById(R.id.listView1);
        listView.setAdapter(new MyAdapter(this, 0, list)); 
        //listView.setOnItemClickListener(this);
    
    class MyAdapter extends ArrayAdapter<EachRow>
    
        LayoutInflater inflat;
        ViewHolder holder;
        public MyAdapter(Context context, int textViewResourceId,
                ArrayList<EachRow> objects) 
        
            super(context, textViewResourceId, objects);
            // TODO Auto-generated constructor stub
            inflat=LayoutInflater.from(context);
        
        @Override
        public View getView(int position, View convertView, ViewGroup parent) 
            // TODO Auto-generated method stub

            if(convertView==null)
            
                convertView=inflat.inflate(R.layout.row_checkox, null);
                holder=new ViewHolder();
                holder.textView=(TextView)convertView.findViewById(R.id.textView1);
                holder.image=(ImageView)convertView.findViewById(R.id.imageView1);
                holder.check=(CheckBox)convertView.findViewById(R.id.checkBox1);
                holder.check.setOnClickListener(CustomList.this);
                convertView.setTag(holder);
            
            holder=(ViewHolder) convertView.getTag();
            EachRow row= getItem(position);
            Log.d("size", row.text);
            holder.textView.setText(row.text); 
            holder.check.setChecked(row.checkBool); 
            holder.check.setTag(position);
            return convertView;
        

        @Override
        public EachRow getItem(int position) 
            // TODO Auto-generated method stub
            return list.get(position);
        

        private class ViewHolder
        
            TextView textView;
            ImageView image;
            CheckBox check;
        
    
    private class EachRow
    
        String text;
        boolean checkBool;
    



    @Override
    public void onClick(View v) 
    
        // TODO Auto-generated method stub

        EachRow row=list.get((Integer)v.getTag());
         row.checkBool=!row.checkBool;
         Log.d("item", "Item Click at "+(Integer)v.getTag()+" : "+row.text+" is "+row.checkBool); 
    


【讨论】:

你觉得它很有用!太棒了。你可以弥补它:) @Pankaj 你能帮我解决这个问题吗***.com/questions/28045149/…【参考方案2】:

比为每个复选框添加 onClickListener 更好,您还可以在列表中使用 ItemClickListener。

参考这篇文章找出被点击的行: onItemClick <string-array> strings.xml (not ListView/ArrayList)

还有其他选项,但它涉及创建自定义行小部件类,并在适配器创建或更新它时将其行位置传递给它。

【讨论】:

当用户点击文本视图(这是整行,因为 cb 设置为 android:layout_alignParentRight="true")时,应该打开一个新活动。但是当用户点击复选框时,我必须知道他们点击了哪个复选框。所以 ItemClickListener 不是一个好选择,不是吗? 是的,erdomester 是对的。当您在列表视图行(自定义行)中有复选框时,复选框会成为焦点。请参阅下面的代码是解决方案【参考方案3】:

您必须在包含所有这些的容器上拥有一个 onTouchListener,并确保在您的侦听器上返回 false,以便它们不会消耗该事件。 onClickListener 会自动使用它。

【讨论】:

【参考方案4】:

如果你只关心文本和复选框,那么你可以使用这个

在 XML 中:

<ListView
    android:id="@+id/listViewCursor"
    android:layout_
    android:layout_
    android:choiceMode="multipleChoice" >

String[] color="red","green","blue","white","yellow","cyan","purple","grey";

list.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, color));

并且在某些事件中检查哪些复选框被选中。

SparseBooleanArray boolArray=list.getCheckedItemPositions();
        int size=list.getCount();
        for(int i=0;i<size;i++)
        
            if(boolArray.valueAt(i)==true)
            
                Log.d("size", color[i]);
            
        

【讨论】:

以上是关于Android如何使用复选框识别列表视图中的项目的主要内容,如果未能解决你的问题,请参考以下文章

如何使用uwp中的全选复选框创建带有复选框项目的列表视图

Android - 通过复选框使用自定义适配器从列表视图中获取项目

Android 使用按钮和对话框复选框的多选项目,并在列表视图中显示所选项目而不是按钮

如何使用复选框将Android联系人添加到列表视图中[重复]

Android如何从同一个数组中仅显示列表视图中的某些项目?

Android:如何在列表视图中自动显示带有复选框的 Sqlite 数据库