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如何使用复选框识别列表视图中的项目的主要内容,如果未能解决你的问题,请参考以下文章
Android - 通过复选框使用自定义适配器从列表视图中获取项目
Android 使用按钮和对话框复选框的多选项目,并在列表视图中显示所选项目而不是按钮
如何使用复选框将Android联系人添加到列表视图中[重复]