zoukankan      html  css  js  c++  java
  • ListView实现RadioButton的单选效果

    首先需要面对的问题:

      1,Android自带的RadioButton单选框只支持添加文字,如果要实现更加复杂的item,由于每个RadioButton不在同级ViewGroup,所以单选效果不能实现

      2,ListView的.getChildAt(index)方法只能获取当前屏幕中显示的item,如果item个数超过屏幕范围会返回null,其结果是灾难性的

     解决了这两个问题下面就好办了

     Item字条目布局,这里用CheckBox实现,当然你也可以自己改成RadioButton,效果是一样的:

    <?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" >
        
        <CheckBox 
            android:id="@+id/check_box"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="0dp"
            android:layout_centerVertical="true"
            android:checked="false"
            style="@style/CustomCheckboxTheme"
            />
         
        <TextView 
            android:id="@+id/tv_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/check_box_passenger_left"
            android:layout_centerInParent="true"
            />
        
        <ImageView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_launcher"
            android:layout_alignParentRight="true"
            />
    </RelativeLayout>

    这里我加了一个自定义的选择风格来改变CheckBox的选择样式,没兴趣的可以跳过直接看下面的java代码

    CheckBox中引用的style  CustomCheckboxTheme

    <style name="CustomCheckboxTheme" parent="@android:style/Widget.CompoundButton.CheckBox">  
            <item name="android:button">@drawable/checkbox_style</item>  
        </style>
    checkbox_style选择器
    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android" >
        
        <item android:drawable="@drawable/air_ticket_check_box_ischecked" android:state_checked="true"/>  
        <item android:drawable="@drawable/air_ticket_check_box_without_checked" android:state_checked="false"/>  
        <item android:drawable="@drawable/air_ticket_check_box_without_checked"/>  
    
    </selector>

    Java代码部分 

      解决方案:

        实现单选效果的方式就是遍历ListView的子条目,将已经选择过的item状态置为false,然后将当前选中item的状态置为true

        为避免获取的item为null,定义一个集合纪录每个item,以保证获取到的是该item上的View

    public class MainActivity extends Activity {
    
        Context mContext = this;
        private ListView lv_radio_select;
        List<View> list = new ArrayList<View>();//用来记录listView的每个item
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            lv_radio_select = (ListView) findViewById(R.id.lv_radio_select);
            lv_radio_select.setAdapter(new MyAdapter());
    
        }
    
        ArrayList<String> initData() {//假数据
            ArrayList<String> data = new ArrayList<String>();
            for (int i = 0; i < 20; i++) {
                data.add("item" + i);
            }
            return data;
        }
      

      //适配器
    class MyAdapter extends BaseAdapter{ ArrayList<String> data = initData(); @Override public int getCount() { return data.size(); } @Override public Object getItem(int position) { return data.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { final Holder holder; if(convertView == null){ convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item_check, parent, false); holder = new Holder(); holder.check = (CheckBox) convertView.findViewById(R.id.check_box); holder.text = (TextView) convertView.findViewById(R.id.tv_name); convertView.setTag(holder); }else{ holder = (Holder) convertView.getTag(); } holder.text.setText(data.get(position)); holder.check.setOnClickListener(new OnClickListener() { //实现单选的逻辑 @Override public void onClick(View v) { // TODO for (int i = 0; i < data.size(); i++) { View item = list.get(i); CheckBox check = (CheckBox) item.findViewById(R.id.check_box); if (check.isChecked()) { check.setChecked(false); } } holder.check.setChecked(true); } }); list.add(convertView);//纪录 return convertView; } class Holder{ CheckBox check; TextView text; } }

    一个简单的ListView单选效果就实现了,下面是运行效果

     

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 一元三次方程
    Java实现 蓝桥杯VIP 算法训练 乘法表
    Java实现 蓝桥杯VIP 算法训练 矩阵加法
    Java实现 蓝桥杯VIP 算法训练 一元三次方程
    Java实现 蓝桥杯VIP 算法训练 平方计算
    Java实现 蓝桥杯VIP 算法训练 平方计算
    Java实现 蓝桥杯VIP 算法训练 平方计算
    Java实现 蓝桥杯VIP 算法训练 乘法表
    Java实现 蓝桥杯VIP 算法训练 乘法表
    监管只是压倒网盘业务的一根稻草,但不是主要原因(答案只有一个:成本!)
  • 原文地址:https://www.cnblogs.com/Joure/p/4136979.html
Copyright © 2011-2022 走看看