2012-08-17 86 views
3

这里我创建自定义列表视图与复选框/ RadioButton。我得到了这个,但我需要单一的选择。自定义ListView与CheckBox单选

我尝试使用这个lstvw.setChoiceMode(ListView.CHOICE_MODE_SINGLE);但它不是为我工作。有没有其他解决方案,请让我知道。

main.java

private ImageAdapter adapter; 

private static String month[] = {"January","February","March","April","May", 
    "June","July","August","September", 
    "October","November","December"}; 


/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ListView lstvw = (ListView) findViewById(R.id.listView); 

    adapter = new ImageAdapter(this, month); 
    lstvw.setAdapter(adapter); 
     lstvw.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

    lstvw.setOnItemClickListener(this); 
} 

我不知道该如何添加代码的复选框插入适配器class.please检查适配器类,如下。

ImageAdapter.class

public class ImageAdapter extends BaseAdapter{ 

public String title[]; 
public String description[]; 
public Activity context; 
public LayoutInflater inflater; 

public ImageAdapter(Activity context,String[] title) { 
    super(); 

    this.context = context; 
    this.title = title; 

    this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return title.length; 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return null; 
} 

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

public static class ViewHolder 
{ 

    TextView txtViewTitle; 

} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 

    ViewHolder holder; 
    if(convertView==null) 
    { 
     holder = new ViewHolder(); 
     convertView = inflater.inflate(R.layout.listitem, null); 

     holder.txtViewTitle = (TextView) convertView.findViewById(R.id.lstvw_textView); 
     convertView.setTag(holder); 
    } 
    else 
     holder=(ViewHolder)convertView.getTag(); 

    holder.txtViewTitle.setText(title[position]); 

    return convertView; 
} 

} 

编辑:

Listitem.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="horizontal" > 

<TextView 
    android:id="@+id/lstvw_textView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_toLeftOf="@+id/itemCheckBox" 
    android:padding="8dp" 
    android:text="hello world" /> 



<CheckBox 
    android:id="@+id/itemCheckBox" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:gravity="right" /> 

+0

使用RadioButton进行单选而不是ListView。 – 2012-08-17 07:05:28

+0

是否想通过单选按钮或多选复选框在整个列表中选择一个项目? – swiftBoy 2012-08-17 07:18:21

+0

@RDC是的,我只想单个项目选择 – 2012-08-17 08:10:04

回答

6

这里是如果我需要在一个时间只选择单个项目我会做什么。

Home.java(活动)

package com.lvcheck.activities; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 

public class Home extends Activity 
{ 
    private ListView lvCheckBox; 
    private Button btnCheckAll, btnClearALl; 
    private String[] arr = {"One", "Two", "Three", "Four", "Five", "Six"}; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     btnCheckAll = (Button)findViewById(R.id.btnCheckAll); 
     btnClearALl = (Button)findViewById(R.id.btnClearAll); 

     lvCheckBox = (ListView)findViewById(R.id.lvCheckBox); 
     lvCheckBox.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
     lvCheckBox.setAdapter(new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_multiple_choice, arr)); 


     btnCheckAll.setOnClickListener(new OnClickListener() 
     {   
      @Override 
      public void onClick(View arg0) 
      { 
       for(int i=0 ; i < lvCheckBox.getAdapter().getCount(); i++) 
       { 
        lvCheckBox.setItemChecked(i, true);    
       } 
      } 
     }); 

     btnClearALl.setOnClickListener(new OnClickListener() 
     {   
      @Override 
      public void onClick(View v) 
      { 
       for(int i=0 ; i < lvCheckBox.getAdapter().getCount(); i++) 
       { 
        lvCheckBox.setItemChecked(i, false);     
       } 
      } 
     }); 
    } 
} 

和我(main.xml中)的XML文件想这

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:orientation="horizontal" 
     android:gravity="center" 
     android:layout_height="wrap_content"> 

     <Button 
      android:layout_width="wrap_content" 
      android:text="Check All" 
      android:layout_marginRight="7dip" 
      android:id="@+id/btnCheckAll" 
      android:layout_height="wrap_content"> 
     </Button> 
     <Button 
      android:layout_width="wrap_content" 
      android:text="Clear All" 
      android:id="@+id/btnClearAll" 
      android:layout_height="wrap_content"> 
     </Button> 
    </LinearLayout> 

    <ListView 
     android:layout_width="fill_parent" 
     android:id="@+id/lvCheckBox" 
     android:fadingEdge="none" 
     android:cacheColorHint="@null" 
     android:layout_height="fill_parent"> 
    </ListView> 
</LinearLayout> 

所以输出会是这样的方式..

enter image description here

来源:here

让我知道你是否对此有任何疑问。

编辑:检查这个有用的链接:Custom Single choice ListView

+0

谢谢,我一直在使用 “新ArrayAdapter (这一点, android.R.layout.simple_list_item_multiple_choice,ARR)” 也做了,但我想这个使用自定义适配器类。 – 2012-08-17 10:39:03

+0

检查[this](http://stackoverflow.com/questions/8337180/custom-single-choice-listview)和[this](http://tokudu.com/2010/android-checkable-linear-layout/)链接一定会帮助你 – swiftBoy 2012-08-17 10:50:22

2

您可以在适配器类使用CheckBox。尝试这个。

@Override 
    public View getView(final int position, View convertView, 
      ViewGroup parent) { 
     // TODO Auto-generated method stub 

     if (convertView == null) { 
      inflater = LayoutInflater.from(adapterContext); 
      convertView = inflater.inflate(R.layout.view, null); 
      final ViewHolder viewHolder = new ViewHolder(); 

      viewHolder.name = (TextView) convertView.findViewById(R.id.txtName); 
      viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox1); 

      convertView.setTag(viewHolder); 
     } 

     final ViewHolder holder = (ViewHolder) convertView.getTag(); 

     holder.name.setText(collectContactList.get(position).getName()); 

     holder.checkBox.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       CheckBox cb = (CheckBox) v; 
       if (cb.isChecked() == true) 
       { 
        // Here you will get list of checked item. 
       } 

       else 
       { 
       // Here you will get list of unchecked item.  
       } 

      } 
     }); 

希望这会帮助你。

+0

谢谢,但我想要单个项目选择 – 2012-08-17 08:10:33

+0

你有关于单选择复选框的任何想法吗? – 2012-08-17 08:21:25

+0

里面的if条件中你可以得到被选中的物品 – Akshay 2012-08-17 08:56:52

0

其简单的和真正有用的。

int selected_position = -1 

public View getView(final int position, View convertView, ViewGroup parent) { 

    if (selected_position == position) { 
     CHECKBOX.setChecked(true); 

    } else { 
     CHECKBOX.setChecked(false); 

    } 
    CHECKBOX.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View view) { 


      if (((CheckBox) view).isChecked()) { 
       selected_position = position; 

      } else { 
       selected_position = -1; 
      } 


      notifyDataSetChanged(); 


     } 
    }); 
    return view; 
}