Android之在RecyclerView列表中實現單選

一、實現效果

單選、可取消選中、列表數據可更新(選擇狀態清空,可重新選擇)

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);

三、完成,Nice!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164212.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164212.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164212.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot集成MyBatis實現多數據源訪問的“秘密”

文章目錄 為什么需要多數據源&#xff1f;Spring Boot集成MyBatis的基礎配置使用多數據源小結 &#x1f389;Spring Boot集成MyBatis實現多數據源訪問的“秘密” ☆* o(≧▽≦)o *☆嗨~我是IT陳寒&#x1f379;?博客主頁&#xff1a;IT陳寒的博客&#x1f388;該系列文章專欄&…

力扣:178. 分數排名(Python3)

題目&#xff1a; 表: Scores ---------------------- | Column Name | Type | ---------------------- | id | int | | score | decimal | ---------------------- 在 SQL 中&#xff0c;id 是該表的主鍵。 該表的每一行都包含了一場比賽的分數。Score …

TCP /UDP協議的 socket 調用的過程

在傳輸層有兩個主流的協議 TCP 和 UDP&#xff0c;socket 程序設計也是主要操作這兩個協議。這兩個協議的區別是什么呢&#xff1f;通常的答案是下面這樣的。 TCP 是面向連接的&#xff0c;UDP 是面向無連接的。TCP 提供可靠交付&#xff0c;無差錯、不丟失、不重復、并且按序…

Selenium介紹及基本使用方法

Selenium是一個開源、免費、簡單、靈活&#xff0c;對Web瀏覽器支持良好的自動化測試工具&#xff0c;在UI自動化、爬蟲等場景下是十分實用的&#xff0c;能夠熟練掌握并使用Selenium工具可以大大的提高效率。 Selenium簡介 Selenium支持多平臺、多瀏覽器、多語言去實現自動化…

深入理解強化學習——馬爾可夫決策過程:動作價值函數

分類目錄&#xff1a;《深入理解強化學習》總目錄 不同于馬爾可夫獎勵過程&#xff0c;在馬爾可夫決策過程中&#xff0c;由于動作的存在&#xff0c;我們額外定義一個動作價值函數&#xff08;Action-value Function&#xff09;。我們用 Q π ( s , a ) Q^\pi(s, a) Qπ(s,a)…

線程提交線程到線程池,有幾種方式,哪一種方式是工作中不能使用的,無法捕捉異常,線程池的拒絕策略,線程池的提交方式

線程池的工作原理 JDK中提交線程到線程池&#xff0c;有幾種方式&#xff0c;哪一種方式是工作中不能使用的&#xff0c;無法捕捉異常 兩種提交任務的方法 ExecutorService 提供了兩種提交任務的方法&#xff1a; execute()&#xff1a;提交不需要返回值的任務 submit()&a…

【C語言】多組輸入

C系列文章目錄 目錄 C系列文章目錄 一、什么是多組輸入&#xff1f; 二、如何使用多組輸入 2.1&#xff0c;試題舉例講解 2.2&#xff0c;錯誤解法 2.3&#xff0c;我們實現多組輸入的思路 2.4&#xff0c;第一種正確的解法 2.5&#xff0c;第二種正確的解法 2.6&…

Python入門教程 | Python3 字典(dict)

Python3 字典 字典是另一種可變容器模型&#xff0c;且可存儲任意類型對象。 Python3中的字典是一種無序、可變、可迭代的數據結構&#xff0c;它由鍵&#xff08;key&#xff09;和對應的值&#xff08;value&#xff09;組成。字典在Python中被視為可變對象&#xff0c;這意…

ES ElasticSearch安裝、可視化工具kibana安裝

1、安裝ES docker run -d --name es9200 -e "discovery.typesingle-node" -p 9200:9200 elasticsearch:7.12.1訪問測試&#xff1a; http://域名:9200/ 2、安裝kibana對es進行可視化操作 執行命令 docker run -d --name kibana5601 -p 5601:5601 kibana:7.1.12.修…

如何實現在公網下使用navicat圖形化工具遠程連接本地內網的MariaDB數據庫

公網遠程連接MariaDB數據庫【cpolar內網穿透】 文章目錄 公網遠程連接MariaDB數據庫【cpolar內網穿透】1. 配置MariaDB數據庫1.1 安裝MariaDB數據庫1.2 測試局域網內遠程連接 2. 內網穿透2.1 創建隧道映射2.2 測試隨機地址公網遠程訪問3. 配置固定TCP端口地址3.1 保留一個固定的…

Redis深入理解-Socket連接建立流程以及文件事件處理機制

Redis Server 運行原理圖 Redis 服務器中 Socket 網絡建立以及文件事件模型 一個 redis 單機&#xff0c;可以抗幾百上千的并發&#xff0c;這里的并發指的就是同時可以有幾百個 client 對這個 redis server 發起請求&#xff0c;都需要去建立網絡連接&#xff0c;同時間可能會…

利用 docker 實現JMeter分布式壓測

為什么需要分布式&#xff1f; 在工作中經常需要對一些關鍵接口做高QPS的壓測&#xff0c;JMeter是由Java 語言開發&#xff0c;沒創建一個線程&#xff08;虛擬用戶&#xff09;&#xff0c;JVM默認會為每個線程分配1M的堆棧內存空間。受限于單臺試壓機的配置很難實現太高的并…

YAML 深入解析:從語法到最佳實踐

什么是YAML YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一種人類可讀的數據序列化語言。它的設計目標是使數據在不同編程語言之間交換和共享變得簡單。YAML采用了一種簡潔、直觀的語法&#xff0c;以易于閱讀和編寫的方式表示數據結構。 YAML廣泛應用于配置文…

【OpenCV實現圖像:制作酷炫的動畫效果】

文章目錄 概要生成背景圖添加點動畫添加文本顯示小結 概要 首先&#xff0c;通過導入必要的庫&#xff0c;包括NumPy用于數學運算和Matplotlib庫用于數據可視化。隨后&#xff0c;創建圖形和軸&#xff0c;初始化點的位置&#xff0c;以及編寫初始化函數和更新函數。 初始化函…

C語言歸并排序

以夢為馬&#xff0c;不負韶華 文章目錄 引入&#xff1a;實現原理問題引出&#xff1a;遞歸實現&#xff1a;迭代實現穩定性分析&#xff1a;總結&#xff1a; 引入&#xff1a; 如何將兩個有序數組&#xff08;假設為升序&#xff09;合并為一個有序數組&#xff1f; 雙指針…

yolov5/v7修改標簽和檢測框顯示【最全】

《記錄自己在使用yolov5遇到的一些問題》同時也供大家參考&#xff0c;如果對你們有幫助&#xff0c;希望大家可以給個點贊、收藏鼓勵下&#xff0c;非常感謝&#xff01; 以自帶的一張圖片作為示例,yolov5(6.1版本)的初始檢測框應該是如下圖所示 修改線條粗細、隱藏標簽、隱…

EI論文故障識別程序:DBN深度置信/信念網絡的故障識別Matlab程序,數據由Excel導入,直接運行!

?適用平臺&#xff1a;Matlab2021b版及以上 本程序參考中文EI期刊《基于變分模態分解和改進灰狼算法優化深度置信網絡的自動轉換開關故障識別》中的深度置信網絡&#xff08;Deep Belief Network&#xff0c;DBN&#xff09;部分進行故障識別&#xff0c;程序注釋清晰&#x…

Python之學生信息管理系統

目錄 一、基礎界面實現 1、主函數 2、保持循環&#xff0c;獲取用戶需求 二、函數實現模塊功能 1、添加學生信息 2、刪除學生信息 3、修改學生信息 4、查找全部學生信息 5、退出系統 三、整合代碼 1、 完整代碼 2、完整實現過程 實現 打印功能菜單、添加學生信息、刪…

想自學軟件測試?一般人我還是勸你算了吧。。。

&#x1f4e2;專注于分享軟件測試干貨內容&#xff0c;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01;&#x1f4e2;交流討論&#xff1a;歡迎加入我們一起學習&#xff01;&#x1f4e2;資源分享&#xff1a;耗時200小時精選的「軟件測試」資…

<keep-alive>作用及用法

<keep-alive>是Vue.js的內置組件。它用于緩存具有相同組件樹的組件。當組件使用<keep-alive>包裹時&#xff0c;組件不會被銷毀&#xff0c;而是會緩存到內存中&#xff0c;等到下次再次渲染時&#xff0c;直接使用緩存中的組件實例。 <keep-alive>有以下幾…