ListView利用CheckedTextViewr实现条目单选效果
来源:互联网 发布:java文件压缩中文乱码 编辑:程序博客网 时间:2024/05/29 15:07
最近遇到的一个小需求,可以简化为该模型,因此写一个Demo以记录。其实比较简单,主要利用Selector,只是网上找了一番也没找到ListView在点击后背景色一直是checked的,大多数是pressed效果(点击瞬间变背景),或者是利用RadioButton or CheckBox之类,这些都不是我想要的。
先放效果图:
分析:
最简单的ListView,其中条目View继承了CheckedTextView。该类实现了Checkable接口,调用其setChecked方法可以匹配selector中android:state_checked="true"属性,做到点击后效果保持。因此也可以自定义View实现Checkable,实现setChecked()、isChecked()、toggle()三个方法即可:
public void toggle() { setChecked(!mChecked); } public boolean isChecked() { return mChecked; } public void setChecked(boolean checked) { if (mChecked != checked) { mChecked = checked; refreshDrawableState(); notifyAccessibilityStateChanged(); } }
做到单选效果,本来我是想到用比较笨的方法,即点击时遍历ItemView,消除其他所有item 的checked状态;还想到了定义一个lastCheckedView变量记录上一次被点击的,再次点击时消除Checked状态。。后来发现只需要在Adapter中getView时判断position,然后notify刷新即可。
如果要实现多选效果,在点击时直接toggle即可,不需要考虑消除其他item状态。
代码如下:
MainActivity.java
public class MainActivity extends Activity {private ListView mListView;private ListViewAdapter<String> mAdapter;private static String[] strs = { "Felix", "Jane", "Tom", "Bob", "Jason","Christina", "Susan", "Felix", "Jane", "Tom", "Bob", "Jason","Christina", "Susan", "Felix", "Jane", "Tom", "Bob", "Jason","Christina", "Susan" };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mListView = (ListView) findViewById(R.id.lv);mAdapter = new ListViewAdapter<String>(this, Arrays.asList(strs));mListView.setAdapter(mAdapter);mListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {if (view instanceof CheckedTextView) {mAdapter.setCheckedAtPosition(position);mAdapter.notifyDataSetChanged();}}});// lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);}}
ListViewItemView.java
public class ListViewItemView extends CheckedTextView {public ListViewItemView(Context context) {super(context);initView();}public ListViewItemView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initView();}public ListViewItemView(Context context, AttributeSet attrs) {super(context, attrs);initView();}private void initView(){this.setPadding(40, 10, 10, 10);this.setTextSize(30);this.setBackgroundResource(R.drawable.item_selector);}}
ListViewAdapter.java
public class ListViewAdapter <T> extends BaseAdapter {private List<T> list;private Context context;private int checkedPos = -1;public ListViewAdapter(Context context, List<T> asList) {this.list = asList;this.context = context;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if(convertView == null){convertView = new ListViewItemView(context);}((TextView)convertView).setText((CharSequence) getItem(position));if(checkedPos == position){//说明该位置需要checked((ListViewItemView)convertView).setChecked(true);}else{//不需要checked((ListViewItemView)convertView).setChecked(false);}return convertView;}/** * 设置哪一个条目被选中 * @param pos */public void setCheckedAtPosition(int pos){this.checkedPos = pos;}}
xml文件
主要是selector
<item android:drawable="@color/wheat" android:state_checked="true"/> <!-- 代表选中状态 --> <item android:state_pressed="true" android:drawable="@color/blanchedalmond"/> <!-- 代表点击状态 --> <item android:drawable="@color/blanchedalmond"></item> <!-- 默认背景 -->
0 0
- ListView利用CheckedTextViewr实现条目单选效果
- listview和imageview实现条目单选效果
- listview和imageview实现条目单选效果
- 实现listview单选效果
- Android实现LIstView条目单选和多选RadioButton
- 自定义listVIew 实现条目文字渐变效果
- CheckedTextView实现ListView的单选效果
- ListView和GridView实现单选效果
- Android ListView 实现Item单选效果
- 用CheckBox实现ListView单选效果
- ListView和GridView实现单选效果
- listview或者gridview 实现单选效果
- ListView+CheckBox实现单选效果
- GridView或者Listview实现单选效果
- listview条目全选、取消、单选
- ListView 单选效果
- ListView + CheckBox实现单选、多选效果
- 实现单选的字体变色效果的listview
- D - Animals
- 二维码 ZBar code 推送
- cin,cout操作符重载相关疑难点
- 【学习ios之路:C语言】小程序:实现类似ATM取款机功能.
- 图像去噪资源推荐 初步
- ListView利用CheckedTextViewr实现条目单选效果
- shell排序和快速排序
- VS2010添加net 2.0框架办法
- C# 获取本机IP
- Hash 表详解(哈希表)
- iOS UISlider的使用详情
- LEETCODE: Integer to Roman
- epoll详解
- 泛型的使用说明