2017-08-31 124 views
0

我有一個生成一個列表視圖有一個複選框,如下一個xml: enter image description hereonclick事件,使複選框

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:padding="10dp" > 
    <CheckBox 
     android:id="@+id/book_check" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_alignParentRight="true" 
     android:checked="false" /> 
    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toLeftOf="@+id/book_check" 
     android:orientation="horizontal" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" > 
     <ImageView 
      android:id="@+id/imageView1" 
      android:layout_width="50dp" 
      android:layout_height="50dp" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" 
      android:src="@drawable/finger" /> 
     <LinearLayout 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:orientation="vertical"> 
      <TextView 
       android:id="@+id/book_title" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:paddingTop="5dp" 
       android:text="Title" 
       android:textColor="#000" 
       android:textSize="22sp" /> 
      <TextView 
       android:text="Description" 
       android:id="@+id/book_descri" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:textColor="#FF2500" 
       android:textSize="18sp" /> 
     </LinearLayout> 
    </LinearLayout> 
</RelativeLayout> 

在我的自定義類,我有以下代碼,以幫助我管理我從我的小數據庫中獲取

private class SbListAdapter extends ArrayAdapter<SbItem> { 
    ArrayList<SbItem> SongBookList; 
    public SbListAdapter(Context context, int textViewResourceId, 
    ArrayList<SbItem> SongBookList) {  
     super(context, textViewResourceId, SongBookList); 
     this.SongBookList = new ArrayList<SbItem>(); 
     this.SongBookList.addAll(SongBookList); 
    } 
    private class ViewHolder { 
     CheckBox book; 
     TextView title; 
     TextView descri; 
    } 
    @SuppressLint("InflateParams") 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; Log.v("ConvertView", String.valueOf(position)); 
     if (convertView == null) { 
      LayoutInflater vi = (LayoutInflater)getSystemService(  
      Context.LAYOUT_INFLATER_SERVICE); 
      convertView = vi.inflate(R.layout.cc_list_select, null); 
      holder = new ViewHolder(); 
      holder.title = (TextView) convertView.findViewById(R.id.book_title); 
      holder.descri = (TextView) convertView.findViewById(R.id.book_descri); 
      holder.book = (CheckBox) convertView.findViewById(R.id.book_check); 
      convertView.setTag(holder); 
      holder.book.setOnClickListener(new View.OnClickListener() {  
       public void onClick(View v) {  
        CheckBox cb = (CheckBox) v ;  
        SbItem SbItem = (SbItem) cb.getTag(); 
        SbItem.setSelected(cb.isChecked()); 
       } 
      }); 
     } else {  
      holder = (ViewHolder) convertView.getTag(); 
     } 
     SbItem SbItem = SongBookList.get(position);  
     holder.title.setText(SbItem.getBook());  
     holder.descri.setText(SbItem.getDescri()); 
     holder.book.setChecked(SbItem.isSelected()); 
     holder.book.setTag(SbItem); 
     return convertView; 
    } 
} 

我的願望是,當點擊一行文本和一致時,該複選框被選中或取消選中,因爲目前這隻能在唯一的複選框是數據CL icked。 如果我嘗試輸入它只是給出錯誤。例如這可不行:

holder.title.setOnClickListener(new View.OnClickListener() {  
    public void onClick(View v) {  
     CheckBox cb = (CheckBox) v ;  
     SbItem SbItem = (SbItem) cb.getTag(); 
     SbItem.setSelected(cb.isChecked()); 
    } 
}); 

我只需要當用戶點擊該項目的任何地方,就像在設置活動工作。

我試圖做到這一點:

convertView.setOnClickListener(new View.OnClickListener() {  
    public void onClick(View v) {  
     CheckBox cb = (CheckBox) v ;  
     SbItem SbItem = (SbItem) cb.getTag(); 
     SbItem.setSelected(cb.isChecked()); 
    } 
}); 

但調試崩潰和控制檯上的錯誤時:

08-31 13:25:19.793:E/AndroidRuntime( 24214): java.lang.ClassCastException:android.widget.RelativeLayout不能 投地android.widget.CheckBox

+0

你的意思是當點擊文本時你需要勾選複選框?如果是,那麼只需使用'convertView.setOnClickListener()....' – Piyush

+0

生成一個錯誤先生 –

+1

@Piyush好友,當用戶點擊單元格上的任何地方時,點擊和反之亦然。 – yash786

回答

-1

由於你的問題你需要改變你的代碼。

convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      holder.book.performClick(); 
     } 
    }); 

現在使用setOnCheckedChangeListener作爲複選框。

holder.book.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (isChecked) { 
       buttonView.setChecked(true); 
       // do your stuff 

      } else { 
       buttonView.setChecked(false); 
       // do your stuff 
      } 
     } 
    }); 
+0

羽絨選民你在哪裏?只是來這裏說負面的迴應。這是工作代碼。 – Piyush

+0

感謝您的代碼,我會在幾個小時內嘗試先生。我想知道爲什麼有人會低估這個答案。相反應該張貼他/她的我們比較 –

+0

在這裏我是...比較... –

1

試試這個:

從您的活動或任何你初始化你的列表視圖:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
//here update the status of your SbItem in the position of your arraylist and then notify the adapter 
     sblist.get(position).setSelected(!sblist.get(position).isSelected()); 
    adapter.notifyDataSetChanged(); 
       } 
      }); 

而且從您的適配器刪除所有點擊聽衆。

UPDATE

在你SbItem類添加二傳手:

public void setSelected(boolean s){ 
     this.selected=s; 
} 

此外,我認爲你的getter返回selected財產

public boolean isSelected(){ 
      return selected; 
    } 
+0

我不得不重建我的listview類,但是你的代碼中缺少一些東西。我無法弄清楚如何更新SbItem的狀態。請使用您的代碼完成代碼 –

0

以下事件中使用的變化選擇框狀態

holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (isChecked) { 
       checkbox.setChecked(true); 
      } else { 
       checkbox.setChecked(false); 
      } 
     } 
    }); 
+0

錯誤的是它等待點擊複選框,當用戶單擊單元格中的其他位置時可能必須實現該複選框。 –