一、實現效果
單選、可取消選中、列表數據可更新(選擇狀態清空,可重新選擇)
RecyclerView列表單選
二、實現步驟
僅展示部分核心代碼,請主要參考適配器的定義
1、Item布局
selected_tip_list_item.xml文件
包含一個TextView和一個右側選中的圖片ImageView√
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"xmlns:app="http://schemas.android.com/apk/res-auto"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="42dp"android:orientation="horizontal"android:gravity="center_vertical"android:paddingStart="8dp"android:paddingEnd="8dp"android:paddingTop="6dp"android:paddingBottom="6dp"><TextViewandroid:id="@+id/tv_tip_name"android:layout_width="wrap_content"android:layout_height="match_parent"android:text="賬號1"android:textColor="@color/color_333333"android:textSize="@dimen/sp_17"android:gravity="center_vertical"/><Viewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><ImageViewandroid:id="@+id/img_selected_icon"android:layout_width="wrap_content"android:layout_height="wrap_content"android:visibility="gone"android:src="@mipmap/selected_tip_icon"/></LinearLayout></LinearLayout>
2、Activity布局
SmartRefreshLayout搭配RecyclerView的使用可參考另一篇文章:Android中SmartRefreshLayout+RecyclerView實現下拉刷新和上拉加載(分頁)顯示網絡請求數據
<com.scwang.smartrefresh.layout.SmartRefreshLayoutandroid:id="@+id/refresh_view_tip_list"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycler_view_select_tip"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginTop="5dp"android:layout_marginBottom="10dp"/>
</com.scwang.smartrefresh.layout.SmartRefreshLayout>
3、RecyclerView的適配器
activity內部自定義適配器TipListAdapter
class TipListAdapter extends RecyclerView.Adapter<MyTipViewHolder>{private boolean isClick = false;private int mPosition = -1; //當前已選中位置public int getmPosition() {return mPosition;}public boolean isClick() {return isClick;}public void setmPosition(int mPosition,boolean isClick) {this.mPosition = mPosition;this.isClick = isClick;}@NonNull@Overridepublic MyTipViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View v = View.inflate(AddTipActivity.this,R.layout.select_tip_list_item, null);MyTipViewHolder holder = new MyTipViewHolder(v);holder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//將點擊選中的Item信息賦值給上方的輸入框mEditTipName.setText(holder.mTvTipName.getText().toString());if (!isClick){setmPosition(holder.getBindingAdapterPosition(),true);}else{setmPosition(holder.getBindingAdapterPosition(),getmPosition() != holder.getBindingAdapterPosition());}notifyDataSetChanged();}});return holder;}@Overridepublic void onBindViewHolder(@NonNull MyTipViewHolder holder, int position) {String info = mTipBeanList.get(position);holder.mTvTipName.setText(info);if (getmPosition() == position && isClick) {//選中某行holder.itemView.setBackground(getDrawable(R.drawable.finished_product_selected_button_background2));holder.mTvTipName.setTextColor(ContextCompat.getColor(AddTipActivity.this,R.color.color_D32124));holder.mImgSelectedIcon.setVisibility(View.VISIBLE);}else if (getmPosition() == position && !isClick){//取消已選中行mEditTipName.setText("");holder.itemView.setBackground(getDrawable(R.drawable.unselected_tip_background));holder.mImgSelectedIcon.setVisibility(View.GONE);holder.mTvTipName.setTextColor(ContextCompat.getColor(AddTipActivity.this,R.color.color_333333));}else {holder.itemView.setBackground(getDrawable(R.drawable.unselected_tip_background));holder.mImgSelectedIcon.setVisibility(View.GONE);holder.mTvTipName.setTextColor(ContextCompat.getColor(AddTipActivity.this,R.color.color_333333));}}@Overridepublic int getItemCount() {return mTipBeanList.size();}//列表更新時調用的方法public void refreshData(List<String> data) {mTipBeanList.clear();mTipBeanList.addAll(data);//列表數據刷新時所有Item均恢復未選中狀態setmPosition(-1,false);notifyDataSetChanged();}}class MyTipViewHolder extends RecyclerView.ViewHolder{TextView mTvTipName;ImageView mImgSelectedIcon; MyTipViewHolder(View itemView) {super(itemView);mTvTipName = itemView.findViewById(R.id.tv_tip_name);mImgSelectedIcon = itemView.findViewById(R.id.img_selected_icon);}}
3、Activity內調用示例
(1)綁定控件
@InjectView(id = R.id.refresh_view_tip_list)
private SmartRefreshLayout mRefreshLayout;@InjectView(id = R.id.recycler_view_select_tip)
private RecyclerView mRecyclerViewAllTips;
(2)初始化列表和適配器
adapter = new TipListAdapter();
mRecyclerViewAllTips.setAdapter(adapter);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
mRecyclerViewAllTips.setLayoutManager(linearLayoutManager);
mRecyclerViewAllTips.setItemAnimator(new DefaultItemAnimator());
//設置下拉刷新和上拉加載樣式
mRefreshLayout.setRefreshHeader(new ClassicsHeader(this));
mRefreshLayout.setOnMultiPurposeListener(new SimpleMultiPurposeListener(){//下拉刷新@Overridepublic void onRefresh(@NonNull RefreshLayout refreshLayout) {super.onRefresh(refreshLayout);//????這里去調用請求數據的方法,并更新adaptermRecyclerViewAllTips.smoothScrollToPosition(0);mRefreshLayout.finishRefresh(1000);}});
//首次進入頁面自動刷新
mRefreshLayout.autoRefresh();
(3)數據請求后,更新adapter
更新列表調用方法如下:
(mList為請求到的數據)
adapter.refreshData(mList);