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