2012-02-25 40 views
3

我真的卡在这里。我想要的不是简单的(对我来说),但是我现在一直在编程android。 我想要的是在每一行中都有一个带有图像视图,文本视图,复选框和另一个textview的列表视图。 让我们先在布局中有一个textview和一个复选框。 基于this教程,我设法做到了这一点(有很多,但这对我来说似乎是最好的)。我有一个listview填充textviews和复选框。Android如何识别listview中的项目与复选框

这是结果:

enter image description here

这是我如何得到我点击的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); 
     } 
    }); 

所以,当我点击水星,我得到水星在text_of_clicked_textview变量中。

但我如何检查我点击了哪个复选框?例如,我点击第三个复选框,我想现在它在地球的一排。最好是如果我知道列表视图(地球)的行中textview的文本和项目的编号()。

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

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

     } 
    }); 

回答

12

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

这是在列表中实现完整的活动: 只是复制这个活动测试,然后理解的代码。将一个列表视图中的主要活动

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

} 
+0

这很好,谢谢。 – erdomester 2012-02-25 23:26:12

+0

你觉得很有用! great.U可以让它起来吧:) – Pankaj 2012-02-26 13:03:19

+0

@Pankaj你能帮我这个吗 http://stackoverflow.com/questions/28045149/setting-image-resourse-by-obtaining-tag-position-for -an-ImageView的,机器人 – 2015-02-10 08:13:15

1

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

请参阅这篇文章,找出已单击该行: onItemClick <string-array> strings.xml (not ListView/ArrayList)

还有其他的选择,但它涉及到创建一个自定义行widget类,并将其传递其行的位置时,你的适配器创建或更新它。

+0

当用户点击TextView的(这是整排,因为CB设置机器人:layout_alignParentRight =“真”),一个新的活动应打开。但是当用户点击复选框时,我必须知道他们点击了哪个复选框。所以ItemClickListener不是一个好的选择,不是吗? – erdomester 2012-02-25 13:55:02

+0

是的,erdomester是对的。当你在列表视图行(自定义行)复选框复选框需要一个focus.See下面的代码是解决方案 – Pankaj 2012-02-25 15:21:06

0

你将不得不在容器上拥有一个onTouchListener,它保存所有这些函数,并确保你的侦听器返回false,以便它们不会消耗事件。 onClickListener会自动使用它。

0

如果你只关注文本和复选框,然后你可以使用这个

在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]); 
      } 
     } 
相关问题