【问题标题】:Android how to identify item in listview with checkboxAndroid如何使用复选框识别列表视图中的项目
【发布时间】: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 ;

      }
    });

【问题讨论】:

    标签: android listview checkbox textview imageview


    【解决方案1】:

    这是 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>
    

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

    【讨论】:

    【解决方案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_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));
      

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

      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]);
                  }
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-03
        • 1970-01-01
        • 2019-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-20
        相关资源
        最近更新 更多