Android中的Serializable、Parcelable">Android中的Serializable、Parcelable
1321
2022-05-30
CheckedtextView是什么
CheckedTextView繼承自TextView且實(shí)現(xiàn)了Checkable接口,對(duì)TextView界面和顯示進(jìn)行了擴(kuò)展的控件,支持Checkable。可以實(shí)現(xiàn)單選或多選功能,在你懶得使用兩者結(jié)合的時(shí)候,這就是不二選擇。
主要XML屬性
android:checkMark 按鈕樣式。
默認(rèn)單選框樣式:android:checkMark="?android:attr/listChoiceIndicatorSingle"
默認(rèn)復(fù)選框樣式:android:checkMark="?android:attr/listChoiceIndicatorMultiple"
當(dāng)然也可以使用drawable自定義樣式
android:checkMarkTint 按鈕的顏色。
android:checkMarkTintMode 混合模式按鈕的顏色。
android:checked 初始選中狀態(tài),默認(rèn)false。
在點(diǎn)擊事件里判斷狀態(tài)設(shè)置狀態(tài)
CheckedTextView.setOnClickListener(new?View.OnClickListener()?{
@Override
public?void?onClick(View?v)?{
CheckedTextView.toggle();//切換選中與非選中狀態(tài)
}
});
咱們看看CheckedTextView.toggle()是干嘛的
public?void?toggle()?{
setChecked(!mChecked);
}
就是實(shí)現(xiàn)這個(gè)控件的狀態(tài)反操作。
第一次點(diǎn)擊無效
android:focusableInTouchMode="true",這個(gè)屬性加上會(huì)導(dǎo)致第一次點(diǎn)擊觸發(fā)不了選擇事件。
實(shí)例
官方文檔指出,結(jié)合ListView使用更佳,咱下面通過一個(gè)栗子了解一下,下面是效果圖:
1.主界面CheckedTextViewActivity.java
public?class?CheckedTextViewActivity?extends?AppCompatActivity?{
private?ListView?lv_ctv_multiple,lv_ctv_single;
private?CtvMultipleAdapter?ctvAdapter;
private?TextView?tv_multiple_title,tv_single_title;
private?CtvSingleAdapter?ctvSingleAdapter;
@Override
protected?void?onCreate(Bundle?savedInstanceState)?{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_textview_ctv);//加載布局文件
initView();
}
private?void?initView()?{
ArrayList
ctvString.add("秦始皇嬴政");
ctvString.add("漢高祖劉邦");
ctvString.add("唐太宗李世民");
ctvString.add("宋太祖趙匡胤");
//復(fù)選
lv_ctv_multiple?=?findViewById(R.id.lv_ctv_multiple);
tv_multiple_title?=?findViewById(R.id.tv_multiple_title);
ctvAdapter?=?new?CtvMultipleAdapter(this,ctvString,tv_multiple_title);
lv_ctv_multiple.setAdapter(ctvAdapter);
//設(shè)置Item間距
lv_ctv_multiple.setDividerHeight(0);
//單選
lv_ctv_single?=?findViewById(R.id.lv_ctv_single);
tv_single_title?=?findViewById(R.id.tv_single_title);
ctvSingleAdapter?=?new?CtvSingleAdapter(this,ctvString,tv_single_title);
lv_ctv_single.setAdapter(ctvSingleAdapter);
//設(shè)置Item間距
lv_ctv_single.setDividerHeight(0);
}
}
2.主布局activity_textview_ctv.xml
android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="@dimen/dimen_20"> android:id="@+id/tv_multiple_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/dimen_10" android:textColor="@color/black" android:text="復(fù)選" android:textSize="@dimen/text_size_16"?/> android:id="@+id/lv_ctv_multiple" android:layout_width="match_parent" android:layout_height="180dp"?/> android:id="@+id/tv_single_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/dimen_10" android:text="單選" android:textColor="@color/color_188FFF" android:layout_marginTop="@dimen/dimen_10" android:textSize="@dimen/text_size_20"?/> android:id="@+id/lv_ctv_single" android:layout_width="match_parent" android:layout_height="match_parent"?/>
3.復(fù)選框Adapter
public?class?CtvMultipleAdapter?extends?BaseAdapter?{
private?LayoutInflater?mInflater;//得到一個(gè)LayoutInfalter對(duì)象用來導(dǎo)入布局
private?List
private?TextView?tvTitle;
private?List
public?CtvMultipleAdapter(Context?context,?List
this.mInflater?=?LayoutInflater.from(context);
this.list?=?list;
tvTitle?=?tv;
}
@Override
public?int?getCount()?{
return?list.size();
}
@Override
public?Object?getItem(int?position)?{
return?null;
}
@Override
public?long?getItemId(int?position)?{
return?0;
}
@Override
public?View?getView(final?int?position,?View?convertView,?ViewGroup?parent)?{
final?CtvViewHolder?holder;
final?String?string?=?list.get(position);
//觀察convertView隨ListView滾動(dòng)情況
if?(convertView?==?null)?{
convertView?=?mInflater.inflate(R.layout.item_ctv_multiple,?null);
holder?=?new?CtvViewHolder();
/*得到各個(gè)控件的對(duì)象*/
holder.ctv_top?=?(CheckedTextView)?convertView.findViewById(R.id.ctv_top);
convertView.setTag(holder);//綁定ViewHolder對(duì)象
}?else?{
holder?=?(CtvViewHolder)?convertView.getTag();//取出ViewHolder對(duì)象
}
holder.ctv_top.setText(string);
//默認(rèn)選中狀態(tài)
if(holder.ctv_top.isChecked()){
//list未包含選中string;
if(!selectList.contains(string)){
selectList.add(string);
}
}
if?(selectList.size()?==?0)?{
tvTitle.setText("");
}?else?{
tvTitle.setText(selectList.toString());
}
holder.ctv_top.setOnClickListener(new?View.OnClickListener()?{
@Override
public?void?onClick(View?v)?{
holder.ctv_top.toggle();//切換選中與非選中狀態(tài)
//單選
if(holder.ctv_top.isChecked()){//
//list未包含選中string;
if(!selectList.contains(string)){
selectList.add(string);
}
}else{
//list未包含選中string;
if(selectList.contains(string)){
selectList.remove(string);
}
}
if?(selectList.size()?==?0)?{
tvTitle.setText("");
}?else?{
tvTitle.setText(selectList.toString());
}
}
});
return?convertView;
}
/*存放控件*/
public?class?CtvViewHolder?{
public?CheckedTextView?ctv_top;
}
@Override
public?boolean?areAllItemsEnabled()?{
return?false;//Item不可點(diǎn)擊
}
@Override
public?boolean?isEnabled(int?position)?{
return?false;//Item不可點(diǎn)擊
//?攔截事件交給上一級(jí)處理
//return?super.isEnabled(position);
}
}
4.復(fù)選框adapter對(duì)應(yīng)布局
android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent"> android:id="@+id/ctv_top" android:checked="true" android:checkMark="?android:attr/listChoiceIndicatorMultiple" android:checkMarkTint="@color/color_FF773D" android:padding="10dp" android:textSize="16sp" android:layout_marginTop="3dp" android:layout_width="match_parent" android:layout_height="wrap_content"?/>
這里用到checkMark(默認(rèn)復(fù)選框樣式)、checkMarkTint(復(fù)選框顏色設(shè)為黃色)、和checked(true默認(rèn)選中)幾個(gè)屬性,可以更好的理解他們。
5.單選框adapter
private?String?selectStr="";//全局變量
holder.ctv_top.setText(string);
holder.ctv_top.setChecked(selectStr.equals(string));
holder.ctv_top.setOnClickListener(new?View.OnClickListener()?{
@Override
public?void?onClick(View?v)?{
holder.ctv_top.toggle();//切換選中與非選中狀態(tài)
//單選
if(holder.ctv_top.isChecked()){
selectStr=string;
}else{
selectStr="";
}
tvTitle.setText(selectStr);
notifyDataSetChanged();
}
});
大部分與復(fù)選框CtvMultipleAdapter設(shè)置相同,僅部分不同就不做多重復(fù)了。
6.單選框adapter對(duì)應(yīng)布局
android:id="@+id/ctv_top" android:checkMark="?android:attr/listChoiceIndicatorSingle" android:padding="10dp" android:textSize="16sp" android:layout_marginTop="3dp" android:layout_width="match_parent" android:layout_height="wrap_content"?/> 僅使用單選默認(rèn)樣式。 7.邏輯處理從adapter放在主界面處理 ListView.setOnItemClickListener(new?AdapterView.OnItemClickListener()?{ @Override public?void?onItemClick(AdapterView>?parent,?View?view,?int?position,?long?id)?{ //在這里進(jìn)行單選復(fù)選的邏輯處理 } }); 使用CheckedTextView配合ListView實(shí)現(xiàn)單選與多選的功能我們實(shí)現(xiàn)了。到這里,關(guān)于CheckedTextView我們也就介紹完了,嘿嘿。 Android
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。