Android使用RecyclerView實現(xiàn)列表數(shù)據(jù)選擇操作
這些時間做安卓盒子項目,因為安卓電視的顯示器比較大,所以一個界面顯示 很多數(shù)據(jù) ,最多的時候,一個Actvity中用到了好幾個RecyclerView。
在RecyclerView中實現(xiàn)Item選中處理時,發(fā)現(xiàn)用CheckBox的OnCheckedChangeListener監(jiān)聽事件時,會達(dá)不到預(yù)期,所以用了OnClickListener來實現(xiàn)。
主界面代碼:
public class CheckRecyclerViewActivity extends AppCompatActivity implements CheckAdapter.CheckItemListener {
//適配器
private CheckAdapter mCheckAdapter;
//列表
private RecyclerView check_rcy;
//全選操作
private CheckBox check_all_cb;
//列表數(shù)據(jù)
private List<CheckBean> dataArray;
//選中后的數(shù)據(jù)
private List<CheckBean> checkedList;
private boolean isSelectAll;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_check_recyclerview);
checkedList = new ArrayList<>();
initDatas();
initViews();
}
private void initViews() {
check_rcy = (RecyclerView) findViewById(R.id.check_rcy);
check_all_cb = (CheckBox) findViewById(R.id.check_all_cb);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
check_rcy.setLayoutManager(linearLayoutManager);
mCheckAdapter = new CheckAdapter(this, dataArray, this);
check_rcy.setAdapter(mCheckAdapter);
//如果使用CheckBox的OnCheckedChangeListener事件,則選中事件會有一些意想不到的結(jié)果,歡迎體驗
//在列表Item中的CheckBox也一樣的效果
check_all_cb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
isSelectAll = !isSelectAll;
checkedList.clear();
if (isSelectAll) {//全選處理
checkedList.addAll(dataArray);
}
for (CheckBean checkBean : dataArray) {
checkBean.setChecked(isSelectAll);
}
mCheckAdapter.notifyDataSetChanged();
}
});
}
private void initDatas() {
dataArray = new ArrayList<>();
for (int i = 0; i < 20; i++) {
CheckBean bean = new CheckBean();
bean.setOrder(String.valueOf(i + 1));
bean.setName("名稱_" + i);
bean.setContent("第" + i + "條內(nèi)容");
bean.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
dataArray.add(bean);
}
}
@Override
public void itemChecked(CheckBean checkBean, boolean isChecked) {
//處理Item點擊選中回調(diào)事件
if (isChecked) {
//選中處理
if (!checkedList.contains(checkBean)) {
checkedList.add(checkBean);
}
} else {
//未選中處理
if (checkedList.contains(checkBean)) {
checkedList.remove(checkBean);
}
}
//判斷列表數(shù)據(jù)是否全部選中
if (checkedList.size() == dataArray.size()) {
check_all_cb.setChecked(true);
} else {
check_all_cb.setChecked(false);
}
}
}
列表數(shù)據(jù)適配器:
public class CheckAdapter extends RecyclerView.Adapter<CheckAdapter.ViewHolder> {
private Context mContext;
private List<CheckBean> mDatas;
private CheckItemListener mCheckListener;
public CheckAdapter(Context mContext, List<CheckBean> mDatas, CheckItemListener mCheckListener) {
this.mContext = mContext;
this.mDatas = mDatas;
this.mCheckListener = mCheckListener;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.check_recyclerview_item, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
final CheckBean bean = mDatas.get(position);
holder.item_order_tv.setText(bean.getOrder());
holder.item_name_tv.setText(bean.getName());
holder.item_content_tv.setText(bean.getContent());
holder.item_time_tv.setText(bean.getTime());
holder.item_cb.setChecked(bean.isChecked());
//點擊實現(xiàn)選擇功能,當(dāng)然可以把點擊事件放在item_cb對應(yīng)的CheckBox上,只是焦點范圍較小
holder.item_content_ll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
bean.setChecked(!bean.isChecked());
holder.item_cb.setChecked(bean.isChecked());
if (null != mCheckListener) {
mCheckListener.itemChecked(bean, holder.item_cb.isChecked());
}
notifyDataSetChanged();
}
});
}
@Override
public int getItemCount() {
return mDatas.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
//序號
private TextView item_order_tv;
//選擇
private CheckBox item_cb;
//整個條目
private LinearLayout item_content_ll;
//名稱
TextView item_name_tv;
//內(nèi)容
TextView item_content_tv;
//時間
private TextView item_time_tv;
public ViewHolder(View itemView) {
super(itemView);
item_order_tv = (TextView) itemView.findViewById(R.id.item_order_tv);
item_cb = (CheckBox) itemView.findViewById(R.id.item_cb);
item_name_tv = (TextView) itemView.findViewById(R.id.item_name_tv);
item_content_tv = (TextView) itemView.findViewById(R.id.item_content_tv);
item_time_tv = (TextView) itemView.findViewById(R.id.item_time_tv);
item_content_ll = (LinearLayout) itemView.findViewById(R.id.item_content_ll);
}
}
public interface CheckItemListener {
void itemChecked(CheckBean checkBean, boolean isChecked);
}
}
測試數(shù)據(jù)實體BEAN:
public class CheckBean implements Serializable {
private String order;
private String name;
private String content;
private String time;
private boolean isChecked;
public String getOrder() {
return order;
}
public void setOrder(String order) {
this.order = order;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public boolean isChecked() {
return isChecked;
}
public void setChecked(boolean checked) {
isChecked = checked;
}
}
主界面布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:background="@drawable/drawable_white_round_bg"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="20dp"
android:orientation="horizontal">
<TextView
android:layout_width="40dp"
android:layout_height="match_parent"
android:text="序號"
android:layout_marginLeft="10dp"
android:textSize="12sp"
android:textColor="#333333"
android:gravity="center"
/>
<CheckBox
android:id="@+id/check_all_cb"
android:layout_width="12dp"
android:layout_gravity="center"
android:button="@null"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_height="12dp"
android:background="@drawable/drawable_cb_selector"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="名稱"
android:layout_marginLeft="10dp"
android:textSize="12sp"
android:textColor="#333333"
android:gravity="center"
/>
<TextView
android:layout_width="100dp"
android:layout_height="match_parent"
android:text="內(nèi)容"
android:layout_marginLeft="10dp"
android:textSize="12sp"
android:textColor="#333333"
android:gravity="center"
/>
<TextView
android:layout_width="80dp"
android:layout_height="match_parent"
android:text="時間"
android:layout_marginLeft="10dp"
android:textSize="12sp"
android:textColor="#333333"
android:gravity="center"
/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="#bcbcbc"></View>
<android.support.v7.widget.RecyclerView
android:id="@+id/check_rcy"
android:layout_width="match_parent"
android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView>
</LinearLayout>
列表Item布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/item_content_ll"
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<TextView
android:id="@+id/item_order_tv"
android:layout_width="40dp"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:textSize="15sp"
android:textColor="#333333"
android:gravity="center"
/>
<CheckBox
android:id="@+id/item_cb"
android:layout_width="20dp"
android:layout_gravity="center"
android:button="@null"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_height="20dp"
android:background="@drawable/drawable_cb_selector"
/>
<TextView
android:id="@+id/item_name_tv"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:textSize="15sp"
android:textColor="#333333"
android:gravity="center"
/>
<TextView
android:id="@+id/item_content_tv"
android:layout_width="100dp"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:textSize="15sp"
android:textColor="#333333"
android:gravity="center"
/>
<TextView
android:id="@+id/item_time_tv"
android:layout_width="120dp"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:textSize="15sp"
android:textColor="#333333"
android:gravity="center"
/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="#bcbcbc"/>
</LinearLayout>
界面布局是隨意寫的,請根據(jù)實際情況調(diào)整。上丑圖:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- kotlin android extensions 插件實現(xiàn)示例詳解
- 一文讀懂Android?Kotlin的數(shù)據(jù)流
- Android使用ViewBinding的詳細(xì)步驟(Kotlin簡易版)
- Android入門之使用RecyclerView完美實現(xiàn)瀑布流界面詳解
- Android studio listview實現(xiàn)列表數(shù)據(jù)顯示 數(shù)據(jù)循環(huán)顯示效果
- Android列表組件ListView使用詳解之動態(tài)加載或修改列表數(shù)據(jù)
- Android kotlin RecyclerView遍歷json實現(xiàn)列表數(shù)據(jù)的案例
相關(guān)文章
Kotlin Flow封裝類SharedFlow StateFlow LiveData使用
這篇文章主要為大家介紹了Kotlin Flow封裝類SharedFlow StateFlow LiveData使用對比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Android學(xué)習(xí)筆記之ListView復(fù)用機制詳解
本篇文章主要介紹了Android學(xué)習(xí)筆記之ListView復(fù)用機制詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
Android實現(xiàn)QQ側(cè)滑(刪除、置頂?shù)?功能
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)QQ側(cè)滑刪除、置頂?shù)裙δ?,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12
Android 將view 轉(zhuǎn)換為Bitmap出現(xiàn)空指針問題解決辦法
這篇文章主要介紹了Android 將view 轉(zhuǎn)換為Bitmap出現(xiàn)空指針問題解決辦法的相關(guān)資料,這里提供實例并提供解決辦法,需要的朋友可以參考下2017-07-07
Android使用Dialog風(fēng)格彈出框的Activity
這篇文章主要為大家詳細(xì)介紹了Android使用Dialog風(fēng)格彈出框的Activity,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09
Android Studio自定義萬能注釋模板與創(chuàng)建類,方法注釋模板操作
這篇文章主要介紹了Android Studio自定義萬能注釋模板與創(chuàng)建類,方法注釋模板操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03

