在ListView中嵌套Switch开关,点击ListView条目来切换Switch的状态

在ListView中添加Switch,让用户去点那个小小的开关的话体验不太好,通过点
击ListView的条目来改变Switch的开关状态.

目标效果
这里写图片描述
点击测试即可切换第一行的Swith的开关状态

需要注意的是正常添加的话Switch会屏蔽掉ListView的onItemClick事件,需要在Switch的布局文件中添加
android:focusable=“false”
否则将无法点击ListView的条目

MainActivity

public class MainActivity extends AppCompatActivity {

    private ListView lv;

    private Adapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lv=(ListView)findViewById(R.id.lv);

        adapter=new Adapter(MainActivity.this);

        adapter.addItem("测试");
        adapter.addItem("测试1");
        adapter.addItem("测试2");

        lv.setAdapter(adapter);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Switch aSwitch=adapter.getaSwitch(i);
                if(aSwitch.isChecked()){
                    aSwitch.setChecked(false);
                    //进行业务处理
                }else {
                    aSwitch.setChecked(true);
                    //进行业务处理
                }
            }
        });

    }
}

ListView适配器

public class Adapter extends BaseAdapter {

    private List<String> list_title;
    private List<Switch> list_switch;

    private Context mContext;

    private TextView tv;
    private Switch aSwitch;

    public Adapter(Context context) {
        mContext=context;
        list_title=new ArrayList<>();
        list_switch=new ArrayList<>();
    }

    public void addItem(String title){
        list_title.add(title);
    }

    public Switch getaSwitch(int position){

        return list_switch.get(position);
    }

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

    @Override
    public Object getItem(int i) {
        return list_title.get(i);
    }

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

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {

        view= LayoutInflater.from(mContext).inflate(R.layout.item,null);
        tv=(TextView)view.findViewById(R.id.tv);
        aSwitch=(Switch)view.findViewById(R.id.aSwitch);

        list_switch.add(aSwitch);

        tv.setText(list_title.get(i));


        return view;
    }
}

MainAvtivity的布局文件只有一个ListView

需要注意的是ListView条目的布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv"
        android:padding="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <Switch
        android:id="@+id/aSwitch"
        android:focusable="false"
        android:clickable="false"
        android:padding="10dp"
        android:layout_alignParentRight="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

在条目布局文件中将Switch的clickable也关闭是为了方便操作,处理开关事件只需要在ListView的itemClickListener中进行,无需再在Switch的onClickListener中再进行一次.

源码下载地址
https://download.csdn.net/download/woqq863787405/13637053
蓝奏:https://wwa.lanzous.com/iXFEOj9eh2b

最后,我只是安卓的新手,如有错误或更好的方法,欢迎大家在评论区进行讨论.

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值