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

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

目标效果
在ListView中嵌套Switch开关,点击ListView条目来切换Switch的状态_第1张图片
点击测试即可切换第一行的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 list_title;
    private List 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中再进行一次.

源码下载地址
CSDN资源到上限了QAQ,百度云失效的话提醒我一下
百度云:https://pan.baidu.com/s/1kUCfhoN

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

你可能感兴趣的:(android,listview,switch)