Android如何使用复选框识别listview中的项目

Android如何使用复选框识别listview中的项目,android,listview,checkbox,textview,imageview,Android,Listview,Checkbox,Textview,Imageview,我真的被困在这里了。我想要的并不简单(对我来说),但我已经为android编程一年了。 我想要的是一个列表视图,每行有一个imageview、一个textview、一个复选框和另一个textview。 让我们先在布局中创建一个文本视图和一个复选框。 基于教程,我设法做到了这一点(有很多,但这似乎是对我最好的)。我有一个用文本视图和复选框填充的列表视图 结果是: 这是我如何获得我单击的文本视图的文本: textView.setOnClickListener(new View.OnClickLi

我真的被困在这里了。我想要的并不简单(对我来说),但我已经为android编程一年了。 我想要的是一个列表视图,每行有一个imageview、一个textview、一个复选框和另一个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时,我在点击文本视图变量的文本中得到Mercury

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

我想我必须在复选框上设置onClickListener,但是接下来呢

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

      }
    });

与向每个复选框添加onClickListener相比,您还可以在列表中使用ItemClickListener

请参阅此帖子以查找已单击的行:


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

在容器上必须有一个onTouchListener来保存所有这些小部件,并确保在侦听器上返回false,以便它们不会使用事件。onClickListener会自动使用它。

如果您只关心文本和复选框,则可以使用此选项

在XML中:

<ListView
    android:id="@+id/listViewCursor"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    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));

字符串[]颜色={“红色”、“绿色”、“蓝色”、“白色”、“黄色”、“青色”、“紫色”、“灰色”};
setAdapter(新的ArrayAdapter(这个,android.R.layout.simple_list_item_multiple_selection,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]);
            }
        }
SparseBooleanArray boolArray=list.getCheckedItemPositions();
int size=list.getCount();

对于(int i=0;i这是ListView中自定义行的XML:

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

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/camera_icon" />

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

        <CheckBox
            android:id="@+id/checkBox1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="" 
     />

</LinearLayout>

这是实施列表的完整活动: 只需复制此活动进行测试,然后理解代码。在主活动中放置一个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); 
    }

}
package com.demost;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.zip.Inflater;
导入android.app.Activity;
导入android.content.Context;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.view.ViewGroup;
导入android.widget.AdapterView;
导入android.widget.AdapterView.OnItemClickListener;
导入android.widget.ArrayAdapter;
导入android.widget.BaseAdapter;
导入android.widget.CheckBox;
导入android.widget.ImageView;
导入android.widget.ListView;
导入android.widget.TextView;
公共类CustomList扩展活动实现OnClickListener
{
列表视图列表视图;
ArrayList=新建ArrayList();
一个接一个;
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
字符串[]颜色={“红色”、“绿色”、“蓝色”、“白色”、“黄色”、“青色”、“紫色”、“灰色”,
“0红色”、“0绿色”、“0蓝色”、“0白色”、“0黄色”、“0蓝色”、“0紫色”、“0灰色”,
“红色”、“绿色”、“蓝色”、“白色”、“黄色”、“彩色”、“紫色”、“紫色”、“黑色”、“灰色”};
for(字符串str:color)
{
每个=新的每个箭头();
each.text=str;
列表。添加(每个);
}
listView=(listView)findViewById(R.id.listView1);
setAdapter(新的MyAdapter(this,0,list));
//setOnItemClickListener(this);
}
类MyAdapter扩展了ArrayAdapter
{
更平坦的充气;
视窗座;
公共MyAdapter(上下文上下文,int textViewResourceId,
ArrayList对象)
{
超级(上下文、textViewResourceId、对象);
//TODO自动生成的构造函数存根
充气=从(上下文)开始的更平坦的布局;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//TODO自动生成的方法存根
if(convertView==空)
{
convertView=充气。充气(R.layout.row\u复选框,空);
holder=新的ViewHolder();
holder.textView=(textView)convertView.findViewById(R.id.textView1);
holder.image=(ImageView)convertView.findViewById(R.id.imageView1);
holder.check=(复选框)convertView.findViewById(R.id.checkBox1);
holder.check.setOnClickListener(CustomList.this);
convertView.setTag(支架);
}
holder=(ViewHolder)convertView.getTag();
每一行=获取项目(位置);
Log.d(“大小”,行.文本);
holder.textView.setText(row.text);
holder.check.setChecked(row.checkBool);
支架.检查.设置标签(位置);
返回视图;
}
@凌驾
public EachRow getItem(内部位置){
//TODO自动生成的方法存根
返回列表。获取(位置);
}
私有类视窗持有者
{
文本视图文本视图;
图像视图图像;
复选框检查;
}
}
每班
{
字符串文本;
布尔校验布尔;
}
@凌驾
公共void onClick(视图v)
{
//TODO自动生成的方法存根
EachRow行=list.get((整数)v.getTag());
row.checkBool=!row.checkBool;
Log.d(“item”,“item单击“+(Integer)v.getTag()+”:“+row.text+”是“+row.checkBool”);
}
}

当用户单击文本视图时(这是整行,becau