Android CheckedTextView 使用+实例

举报
帅次 发表于 2021/12/22 23:01:00 2021/12/22
【摘要】 CheckedTextView是什么         CheckedTextView继承自TextView且实现了Checkable接口,对TextView界面和显示进行了扩展的控件,支持Checkable。可以实现单选或多选功能,在你懒得使用两者结合的时...

CheckedTextView是什么

        CheckedTextView继承自TextView且实现了Checkable接口,对TextView界面和显示进行了扩展的控件,支持Checkable。可以实现单选多选功能,在你懒得使用两者结合的时候,这就是不二选择。

主要XML属性

        android:checkMark 按钮样式。

  • 默认单选框样式:android:checkMark="?android:attr/listChoiceIndicatorSingle"

  • 默认复选框样式:android:checkMark="?android:attr/listChoiceIndicatorMultiple"

  • 当然也可以使用drawable自定义样式

        android:checkMarkTint 按钮的颜色。

        android:checkMarkTintMode 混合模式按钮的颜色。 

        android:checked 初始选中状态,默认false。

在点击事件里判断状态设置状态


  
  1. CheckedTextView.setOnClickListener(new View.OnClickListener() {
  2.     @Override
  3.     public void onClick(View v) {
  4.         CheckedTextView.toggle();//切换选中与非选中状态
  5.     }
  6. });

        咱们看看CheckedTextView.toggle()是干嘛的


  
  1. public void toggle() {
  2.     setChecked(!mChecked);
  3. }

        就是实现这个控件的状态反操作。

第一次点击无效

        android:focusableInTouchMode="true",这个属性加上会导致第一次点击触发不了选择事件。

实例

        官方文档指出,结合ListView使用更佳,咱下面通过一个栗子了解一下,下面是效果图:

1.主界面CheckedTextViewActivity.java


  
  1. public class CheckedTextViewActivity extends AppCompatActivity {
  2.     private ListView lv_ctv_multiple,lv_ctv_single;
  3.     private CtvMultipleAdapter ctvAdapter;
  4.     private TextView tv_multiple_title,tv_single_title;
  5.     private CtvSingleAdapter ctvSingleAdapter;
  6.     @Override
  7.     protected void onCreate(Bundle savedInstanceState) {
  8.         super.onCreate(savedInstanceState);
  9.         setContentView(R.layout.activity_textview_ctv);//加载布局文件
  10.         initView();
  11.     }
  12.     private void initView() {
  13.         ArrayList<String> ctvString = new ArrayList<>();
  14.         ctvString.add("秦始皇嬴政");
  15.         ctvString.add("汉高祖刘邦");
  16.         ctvString.add("唐太宗李世民");
  17.         ctvString.add("宋太祖赵匡胤");
  18.         //复选
  19.         lv_ctv_multiple = findViewById(R.id.lv_ctv_multiple);
  20.         tv_multiple_title = findViewById(R.id.tv_multiple_title);
  21.         ctvAdapter = new CtvMultipleAdapter(this,ctvString,tv_multiple_title);
  22.         lv_ctv_multiple.setAdapter(ctvAdapter);
  23.         //设置Item间距
  24.         lv_ctv_multiple.setDividerHeight(0);
  25.         //单选
  26.         lv_ctv_single = findViewById(R.id.lv_ctv_single);
  27.         tv_single_title = findViewById(R.id.tv_single_title);
  28.         ctvSingleAdapter = new CtvSingleAdapter(this,ctvString,tv_single_title);
  29.         lv_ctv_single.setAdapter(ctvSingleAdapter);
  30.         //设置Item间距
  31.         lv_ctv_single.setDividerHeight(0);
  32.     }
  33. }

2.主布局activity_textview_ctv.xml


  
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:orientation="vertical"
  6.     android:padding="@dimen/dimen_20">
  7.     <TextView
  8.         android:id="@+id/tv_multiple_title"
  9.         android:layout_width="match_parent"
  10.         android:layout_height="wrap_content"
  11.         android:layout_marginLeft="@dimen/dimen_10"
  12.         android:textColor="@color/black"
  13.         android:text="复选"
  14.         android:textSize="@dimen/text_size_16" />
  15.     <ListView
  16.         android:id="@+id/lv_ctv_multiple"
  17.         android:layout_width="match_parent"
  18.         android:layout_height="180dp" />
  19.     <TextView
  20.         android:id="@+id/tv_single_title"
  21.         android:layout_width="match_parent"
  22.         android:layout_height="wrap_content"
  23.         android:layout_marginLeft="@dimen/dimen_10"
  24.         android:text="单选"
  25.         android:textColor="@color/color_188FFF"
  26.         android:layout_marginTop="@dimen/dimen_10"
  27.         android:textSize="@dimen/text_size_20" />
  28.     <ListView
  29.         android:id="@+id/lv_ctv_single"
  30.         android:layout_width="match_parent"
  31.         android:layout_height="match_parent" />
  32. </LinearLayout>

3.复选框Adapter


  
  1. public class CtvMultipleAdapter extends BaseAdapter {
  2.     private LayoutInflater mInflater;//得到一个LayoutInfalter对象用来导入布局
  3.     private List<String> list;
  4.     private TextView tvTitle;
  5.     private List<String> selectList = new ArrayList<>();
  6.     public CtvMultipleAdapter(Context context, List<String> list, TextView tv) {
  7.         this.mInflater = LayoutInflater.from(context);
  8.         this.list = list;
  9.         tvTitle = tv;
  10.     }
  11.     @Override
  12.     public int getCount() {
  13.         return list.size();
  14.     }
  15.     @Override
  16.     public Object getItem(int position) {
  17.         return null;
  18.     }
  19.     @Override
  20.     public long getItemId(int position) {
  21.         return 0;
  22.     }
  23.     @Override
  24.     public View getView(final int position, View convertView, ViewGroup parent) {
  25.         final CtvViewHolder holder;
  26.         final String string = list.get(position);
  27.         //观察convertView随ListView滚动情况
  28.         if (convertView == null) {
  29.             convertView = mInflater.inflate(R.layout.item_ctv_multiple, null);
  30.             holder = new CtvViewHolder();
  31.             /*得到各个控件的对象*/
  32.             holder.ctv_top = (CheckedTextView) convertView.findViewById(R.id.ctv_top);
  33.             convertView.setTag(holder);//绑定ViewHolder对象
  34.         } else {
  35.             holder = (CtvViewHolder) convertView.getTag();//取出ViewHolder对象
  36.         }
  37.         holder.ctv_top.setText(string);
  38.         //默认选中状态
  39.         if(holder.ctv_top.isChecked()){
  40.             //list未包含选中string;
  41.             if(!selectList.contains(string)){
  42.                 selectList.add(string);
  43.             }
  44.         }
  45.         if (selectList.size() == 0) {
  46.             tvTitle.setText("");
  47.         } else {
  48.             tvTitle.setText(selectList.toString());
  49.         }
  50.         holder.ctv_top.setOnClickListener(new View.OnClickListener() {
  51.             @Override
  52.             public void onClick(View v) {
  53.                 holder.ctv_top.toggle();//切换选中与非选中状态
  54.                 //单选
  55.                 if(holder.ctv_top.isChecked()){//
  56.                     //list未包含选中string;
  57.                     if(!selectList.contains(string)){
  58.                         selectList.add(string);
  59.                     }
  60.                 }else{
  61.                     //list未包含选中string;
  62.                     if(selectList.contains(string)){
  63.                         selectList.remove(string);
  64.                     }
  65.                 }
  66.                 if (selectList.size() == 0) {
  67.                     tvTitle.setText("");
  68.                 } else {
  69.                     tvTitle.setText(selectList.toString());
  70.                 }
  71.             }
  72.         });
  73.         return convertView;
  74.     }
  75.     /*存放控件*/
  76.     public class CtvViewHolder {
  77.         public CheckedTextView ctv_top;
  78.     }
  79.     @Override
  80.     public boolean areAllItemsEnabled() {
  81.         return false;//Item不可点击
  82.     }
  83.     @Override
  84.     public boolean isEnabled(int position) {
  85.         return false;//Item不可点击
  86.         // 拦截事件交给上一级处理
  87.         //return super.isEnabled(position);
  88.     }
  89. }

4.复选框adapter对应布局


  
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="match_parent"
  4.     android:orientation="vertical"
  5.     android:layout_height="match_parent">
  6.     <CheckedTextView
  7.         android:id="@+id/ctv_top"
  8.         android:checked="true"
  9.         android:checkMark="?android:attr/listChoiceIndicatorMultiple"
  10.         android:checkMarkTint="@color/color_FF773D"
  11.         android:padding="10dp"
  12.         android:textSize="16sp"
  13.         android:layout_marginTop="3dp"
  14.         android:layout_width="match_parent"
  15.         android:layout_height="wrap_content" />
  16. </LinearLayout>

        这里用到checkMark(默认复选框样式)、checkMarkTint(复选框颜色设为黄色)、和checked(true默认选中)几个属性,可以更好的理解他们。

5.单选框adapter


  
  1.   private String selectStr="";//全局变量
  2.         holder.ctv_top.setText(string);
  3.         holder.ctv_top.setChecked(selectStr.equals(string));
  4.         holder.ctv_top.setOnClickListener(new View.OnClickListener() {
  5.             @Override
  6.             public void onClick(View v) {
  7.                 holder.ctv_top.toggle();//切换选中与非选中状态
  8.                 //单选
  9.                 if(holder.ctv_top.isChecked()){
  10.                     selectStr=string;
  11.                 }else{
  12.                     selectStr="";
  13.                 }
  14.                 tvTitle.setText(selectStr);
  15.                 notifyDataSetChanged();
  16.             }
  17.         });

        大部分与复选框CtvMultipleAdapter设置相同,仅部分不同就不做多重复了。

6.单选框adapter对应布局


  
  1.  <CheckedTextView
  2.         android:id="@+id/ctv_top"
  3.         android:checkMark="?android:attr/listChoiceIndicatorSingle"
  4.         android:padding="10dp"
  5.         android:textSize="16sp"
  6.         android:layout_marginTop="3dp"
  7.         android:layout_width="match_parent"
  8.         android:layout_height="wrap_content" />

        仅使用单选默认样式。

7.逻辑处理从adapter放在主界面处理


  
  1.   ListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  2.             @Override
  3.             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  4.                 //在这里进行单选复选的逻辑处理
  5.             }
  6.         });

        使用CheckedTextView配合ListView实现单选与多选的功能我们实现了。到这里,关于CheckedTextView我们也就介绍完了,嘿嘿。

文章来源: shuaici.blog.csdn.net,作者:帅次,版权归原作者所有,如需转载,请联系作者。

原文链接:shuaici.blog.csdn.net/article/details/118972930

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。