• 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单选效果就实现了,下面是运行效果

     

  • 相关阅读:
    Spring MVC
    Hibernate的状态
    设计模式
    Git在Eclipse中的使用
    深入理解Node.js基于事件驱动的回调
    nodejs核心技术
    webpack使用
    vue各种实例集合
    vue之component
    axios详解
  • 原文地址:https://www.cnblogs.com/Joure/p/4136979.html
Copyright © 2020-2023  润新知