listView单选实现的两种方式

来源:互联网 发布:清华计算机 知乎 编辑:程序博客网 时间:2024/06/05 04:28

1. listview有个属性

android:choiceMode ="singleChoice" 表示选择一个  android:choiceMode ="multipleChoice"表示选择两个 

2. 布局中如下

<Button      android:id="@+id/button"      android:layout_width= "match_parent"      android:layout_height= "wrap_content"      android:text= "点击显示获取数字"      android:padding="10dp" />    <ListView      android:id="@+id/listView"      android:layout_below= "@+id/button"      android:layout_width= "match_parent"      android:layout_height= "match_parent"      android:choiceMode="singleChoice" >  </ListView> 

3. java代码中为listview设置adapter,这里用默认的

private String[] GENRES = { "11", "22" , "33" , "44" , "55" , "66" , "77", "88" , "99" , "00" };  listView.setAdapter( new ArrayAdapter<String>( this,                     android.R.layout.simple_list_item_single_choice , GENRES ));


simple_list_item_single_choice里的控件是CheckedTextView,其实是一个实现了checkable接口的textView

4.此时listView就有单选效果了,截图如下:




5. 如何获取已经选中的数据呢?这里单选或多选的数据会被控件记住,当我们点击显示获取数字的按钮时,我们用代码获取选中的信息,并显示

int position = listView .getCheckedItemPosition();     // 即获取选中位置  if(ListView.INVALID_POSITION != position){       Toast.makeText(MainActivity.this, groups.get(position), 0).show();  }


上面知道可以使用android自带的listview的chiocemode的单选模式实现。但那个布局是系统自带的checkedTextView,有时候我们需要自己实现布局,那么下面我们开始实现

自定义组合布局,实现checkable接口。

public class SingleView extends LinearLayout implements Checkable {         private TextView mText;       private CheckBox mCheckBox;       public SingleView(Context context, AttributeSet attrs, int defStyle) {              super(context, attrs, defStyle);             initView(context);       }         public SingleView(Context context, AttributeSet attrs) {              super(context, attrs);             initView(context);       }         public SingleView (Context context) {              super(context);             initView(context);       }         private void initView(Context context){              // 填充布局             LayoutInflater inflater = LayoutInflater.from(context);             View v = inflater.inflate(R.layout.item_single_layout , this, true);              mText = (TextView) v.findViewById(R.id. title);              mCheckBox = (CheckBox) v.findViewById(R.id. checkbox);       }         @Override       public void setChecked( boolean checked) {              mCheckBox.setChecked(checked);                    }         @Override       public boolean isChecked() {              return mCheckBox.isChecked();       }         @Override       public void toggle() {              mCheckBox.toggle();       }              public void setTitle(String text){              mText.setText(text);       }  } 

activity中试下代码:

public class MainActivity extends Activity {       private ArrayList<String> groups;       private ListView listView;         @Override       protected void onCreate(Bundle savedInstanceState) {              super.onCreate(savedInstanceState);             setContentView(R.layout. activity_main);                listView = (ListView) findViewById(R.id. listView);                groups = new ArrayList<String>();              groups.add( "11");              groups.add( "22");              groups.add( "33");              groups.add( "44");              groups.add( "55");              groups.add( "66");              groups.add( "77");              groups.add( "88");              groups.add( "99");              groups.add( "00");               SingleAdapter singleAdapter = new SingleAdapter();              listView.setAdapter(singleAdapter);               Button button = (Button) findViewById(R.id. button);             button.setOnClickListener( new OnClickListener() {                     @Override                   public void onClick(View v) {                       PickNum();                  }             });       }         private void PickNum() {              int position = listView.getCheckedItemPosition();              if (ListView. INVALID_POSITION != position) {                  Toast. makeText(MainActivity.this, groups.get(position), 0).show();             }       }         private class SingleAdapter extends BaseAdapter {                @Override              public int getCount() {                   return groups.size();             }                @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;             }                @Override              public View getView( final int position, View convertView,                       ViewGroup parent) {                   final SingleView singleView = new SingleView(MainActivity.this );                  singleView.setTitle( groups.get(position));                   return singleView;               }         }  } 

效果:



如果要替换默认checkbox的图标显示,设置checkbox的button属性即可。



1 0
原创粉丝点击