2012-09-04 34 views
2

我有一個ListView,其中列表中的每個元素都包含一個TextView和兩個不同的按鈕。事情是這樣的:Android:具有多個可點擊元素的ListView元素

ListView 
-------------------- 
[ImageView][Text][CheckBox][Button] 
-------------------- 
[ImageView][Text][CheckBox][Button] 
-------------------- 
... (and so on) ... 

有了這個代碼,我可以爲整個項目創建一個OnItemClickListener

listView.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> list, View view, int position, long id) { 
     Log.i(TAG, "onListItemClick: " + position); 

     } 

    } 
}); 

不過,我不希望整個項目可以點擊,但只有複選框,每個列表元素的按鈕。

所以我的問題是,我該如何實現onClickListener這兩個按鈕具有下列參數:

  • int id
  • int position(這是元素(在列表中的每個項目相關聯的一些ID)在其上單擊按鈕發生的列表)

回答

1

您需要baseAdpter實現這一位置設置爲final

public class ContactsAdapter extends BaseAdapter { 

    ArrayList<ContactInfo> mlist; 
    Context mcontext; 


public BluetoothChatadpter(Context context,ArrayList<ChatInfo> mchtlist) {  
     mlist = mchtlist; 
     mcontext = context; 

    } 

    @Override 
    public int getCount() { 
     return mlist.size(); 
    } 

    @Override 
    public Object getItem(int postion) { 
     return mlist.get(postion); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
     public View getView(int position, View convertview, ViewGroup viewgroup){ 
      View view = null; 
      if(convertview == null){ 
       LayoutInflater inflater = context.getLayoutInflater(); 
       view = inflater.inflate(R.layout.contactrow, null); 

       ContactHolder holder = new ContactHolder(); 

       holder.txtviewfirstname = (TextView)view.findViewById(R.id.firstname); 
       holder.txtviewphone = (TextView)view.findViewById(R.id.phone); 
       holder.chkselected = (CheckBox)view.findViewById(R.id.check); 

       setOnClickListener(new OnClickListener() { 
     @Override 
      public void onClick(View arg0) { 
      // to open the selected file in resp 

        // do your work here 
       }}); 


    chkselected .setOnClickListener(new OnClickListener() { 
     @Override 
    public void onClick(View v) { 
    // Toast.makeText(context,// "checked is clicke="+pos, 12).show(); 
      if (chkselected.isChecked())   
         {    

         // do your work here 
      } else { 

    // do your work here        
      } 
     } 
}); 



      view.setTag(holder); 

     } 
      else{ 
       view = convertview; 
      } 
      ContactHolder holder2 = (ContactHolder) view.getTag(); 
      holder2.txtviewfirstname.setText(list.get(position).firstname); 
      holder2.txtviewphone.setText(list.get(position).phonenumber); 
      holder2.chkselected.setChecked(list.get(position).selected); 
      return view; 
     } 

} 
0

您必須在您的適配器getView方法做..

0

方便,只需實現OnClickListener這兩個按鈕,並得到你從getView()得到這個職位,請確保你爲了得到它OnClickListener

0

您可以在您的getView()方法的Adapter中添加監聽器。

0

不添加onItemClickListener爲ListView而添加的onClick爲您所需的按鈕和複選框做到像下面的代碼這樣

CheckBox cbox = new CheckBox(this);// find your checkbox from the view here. 
     cbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

@Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub if(isChecked){ // do what ever you want. } } });
0

檢查它可以幫助你。

private class ListViewAdapter extends BaseAdapter { 

     private LayoutInflater mInflater; 

     public ListViewAdapter(Context con) { 
      // TODO Auto-generated constructor stub 
      mInflater = LayoutInflater.from(con); 
     } 

     public int getCount() { 
      // TODO Auto-generated method stub 
      return main_genral_class.review_name.size(); 
     } 

     public Object getItem(int position) { 
      // TODO Auto-generated method stub 

      return position; 
     } 

     public long getItemId(int position) { 
      // TODO Auto-generated method stub 
      return position; 
     } 

     public View getView(int position, View convertView, ViewGroup parent) { 
      // TODO Auto-generated method stub 
      ListContent holder; 

      if (convertView == null) { 
       convertView = mInflater.inflate(R.layout.review_row, null); 
       holder = new ListContent(); 

       holder.img = (ImageView) convertView 
         .findViewById(R.id.imageView1); 
       holder.name = (TextView) convertView 
         .findViewById(R.id.textView1); 
       holder.check_date = (TextView) convertView 
         .findViewById(R.id.textView2); 




       holder.img.setOnClickListener(mOnTitleClickListener); 
       holder.name.setOnClickListener(mOnTitleClickListener1); 
       holder.check_date.setOnClickListener(mOnTitleClickListener2); 


       convertView.setTag(holder); 
      } else { 

       holder = (ListContent) convertView.getTag(); 
      } 

      holder.text2.setText(main_genral_class.review_shout.get(position)); 
      return convertView; 
     } 
    } 

private OnClickListener mOnTitleClickListener = new OnClickListener() { 
     public void onClick(View v) { 
      final int position = mListView.getPositionForView((View) v 
        .getParent()); 

       Toast.makeText(review_activity.this, "click on Image View", 
         Toast.LENGTH_SHORT).show(); 

     } 
    }; 

private OnClickListener mOnTitleClickListener1 = new OnClickListener() { 
      public void onClick(View v) { 
       final int position = mListView.getPositionForView((View) v 
         .getParent()); 

        Toast.makeText(review_activity.this, "click on Text View", 
          Toast.LENGTH_SHORT).show(); 

      } 
     }; 

private OnClickListener mOnTitleClickListener2 = new OnClickListener() { 
      public void onClick(View v) { 
       final int position = mListView.getPositionForView((View) v 
         .getParent()); 

        Toast.makeText(review_activity.this, "click on Date Text View", 
          Toast.LENGTH_SHORT).show(); 

      } 
     }; 
1

我解決這樣同樣的問題:在ListViewItem的layout.xml 給元素的標籤,其中你想添加OnClickListener:

 android:id="@+id/CheckBox" 
     android:tag="CheckBox" /> 

....

 android:id="@+id/Button" 
     android:tag="Button" /> 

在代碼中,在您的ListView充氣添加OnClickListener用下面的代碼:

 listView.findViewWithTag("CheckBox").setOnClickListener(createCheckBoxOnClickListener(act)); 
     listView.findViewWithTag("Button").setOnClickListener(createButtonOnClickListener(act));