单选与双选实现的效果如下
CheckedTextView 继承的是 TextView 实现 Checkable 具有TextView 的属性
一般使用结合ListView
xml 属性
android:checkMark : 可绘制用于复选标记图形
android:checked : 指示文本的初始检查状态
默认提供单选框样式:
android:checkMark="?android:attr/listChoiceIndicatorSingle"
默认的效果图如下
默认提供复选框样式:
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
默认的效果图如下
下面结合代码说下使用
MainActivity 的代码如下
public class MainActivity extends AppCompatActivity {
private String[] data = {"Android", "Java", "C++", "PHP", "Python", "JS", "HTML", "CSS"};
private ListView listView;
ArrayList<String> arrayList = new ArrayList<>();
SingleCheckAdapter adapter;
private ListView listView1;
ArrayList<String> arrayList1 = new ArrayList<>();
List<String> list = new ArrayList<>();
MultCheckAdapter adapter1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 单选数据
listView = findViewById(R.id.listView);
arrayList.addAll(Arrays.asList(data));
adapter = new SingleCheckAdapter(MainActivity.this, arrayList);
listView.setAdapter(adapter);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.v("----hxm", "您选择的是:" + arrayList.get(position));
}
});
//多选数据
listView1 = findViewById(R.id.listView1);
arrayList1.addAll(Arrays.asList(data));
adapter1 = new MultCheckAdapter(MainActivity.this, arrayList1);
listView1.setAdapter(adapter1);
listView1.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
listView1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (list.contains(arrayList1.get(position))) {
list.remove(arrayList1.get(position));
} else {
list.add(arrayList.get(position));
}
Log.v("----hxm", "您选择的是:" + list);
}
});
}
}
SingleCheckAdapter 的代码如下:
package com.hly.timeactivity;
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckedTextView;
public class SingleCheckAdapter extends BaseAdapter {
private ArrayList<String> list;
private Context mContext;
private ArrayList<String> resultList = new ArrayList<>();
public SingleCheckAdapter(Context context, ArrayList<String> list) {
this.list = list;
this.mContext = context;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(R.layout.single_list_item_layout, null);
holder.checkedTextView = convertView.findViewById(R.id.checkedTextView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.checkedTextView.setText(list.get(position));
return convertView;
}
public static class ViewHolder {
CheckedTextView checkedTextView;
}
}
xml :single_list_item_layout
<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="60dp"
android:id="@+id/checkedTextView"
android:checkMark="@drawable/drawable_single_checked_view"
android:text="CheckedTextView"
android:textSize="25sp" />
drawable_single_checked_view
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/single_select" android:state_checked="true" />
<item android:drawable="@drawable/single_unselect" android:state_checked="false" />
</selector>
由于多选和单选差不多,这里就不贴代码了, 代码都很简单的,别的就不多说了, 不过还需要特别注意下,list 的item 最外层的布局要使用CheckedTextView, 这个监听的时候点击item 就相当于点击了CheckedTextView,
如果最外层不是CheckedTextView 点击事件会有问题.