2012-02-25 96 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]); 
      } 
     }