Android RecyclerView嵌套EditView實時更新Item數據

一、場景(例如:購物車)

1、當我們需要以列表樣式管理某些數據時,可能需要列表項的某個字段可編輯

2、編輯Item上的某個字段后可能還要更新相關字段的值

二、可能遇到的問題

1、列表滑動導致輸入框中的數據錯位(或者焦點錯位)

2、無法更新Item上相關的字段項的值

3、監聽輸入框文本更改時陷入死循環

三、可行方案(RecyclerView+TextWatcher

? ? ? ?1、用RecyclerView 實現一個ListView的效果:

package com.zhn.edit.recycler;import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity implements View.OnClickListener,EditAbleListAdapter.EditAbleListAdapterListener{private FloatingActionButton mFLoatingBtnEmail;private RecyclerView mRecyclerEditAble;private LinearLayoutManager mEditAbleLayoutManager;private EditAbleListAdapter mEditAbleListAdapter;private List<datagoods> mDataGoods=new ArrayList<datagoods>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mFLoatingBtnEmail = (FloatingActionButton) findViewById(R.id.floating_btn_email);mFLoatingBtnEmail.setOnClickListener(this);mRecyclerEditAble= (RecyclerView) findViewById(R.id.recycler_editable);initData();}private void initData() {mEditAbleLayoutManager=new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);mRecyclerEditAble.setLayoutManager(mEditAbleLayoutManager);mEditAbleListAdapter=new EditAbleListAdapter(this,this);mRecyclerEditAble.setAdapter(mEditAbleListAdapter);for (int i=1;i<11;i++){mDataGoods.add(new DataGoods("Goods"+i,i,i,i*i));}mEditAbleListAdapter.refreshDatas(mDataGoods);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.floating_btn_email:for (int i=0;i<mdatagoods.size();i++){ 
            log.e(mainactivity.class.getsimplename(),mdatagoods.get(i).tostring());="" }="" break;="" default:="" @override="" public="" void="" onedittextchanged(int="" position,="" string="" value)="" {="" todo="" 此處或者回調前應做值合法性驗證="" mdatagoods.get(position).setnum(integer.parseint(value));="" <="" pre=""></mdatagoods.size();i++){></datagoods></datagoods>

? ? ? ?2、在Adapter中自定義一個Interface 用來將輸入的值回傳給Activity

? ? ? ?3、定義TxtWatcher 接收position和要同步更新的文本框

? ? ? ?4、給EditText添加焦點變化的監聽器,根據焦點狀態綁定和解綁TxtWatcher

package com.zhn.edit.recycler;import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;import java.util.ArrayList;
import java.util.List;/*** Created by zhn* 2017/7/9 下午4:20*/
public class EditAbleListAdapter extends RecyclerView.Adapter{public void refreshDatas(List<datagoods> mDataGoods) {mDatas.clear();mDatas.addAll(mDataGoods);notifyDataSetChanged();}public interface EditAbleListAdapterListener{public void onEditTextChanged(int position,String value);}private Context mContext;private List<datagoods> mDatas=new ArrayList<datagoods>();private EditAbleListAdapterListener mListener;public EditAbleListAdapter(Context context,EditAbleListAdapterListener listener){this.mContext=context;this.mListener=listener;}@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {return new EditAbleListViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_editable_view,null));}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {((EditAbleListViewHolder)holder).setContent(position,mDatas.get(position));}@Overridepublic int getItemCount() {return mDatas.size();}public class EditAbleListViewHolder extends RecyclerView.ViewHolder{private TextView mTvItemNo;private TextView mTvGoodsName;private TextView mTvPrice;private EditText mEtNum;private TextView mTvTotalPrice;private TxtWatcher mTxtWatcher;public EditAbleListViewHolder(View itemView) {super(itemView);mTvItemNo= (TextView) itemView.findViewById(R.id.tv_item_no);mTvGoodsName= (TextView) itemView.findViewById(R.id.tv_goods_name);mTvPrice= (TextView) itemView.findViewById(R.id.tv_price);mEtNum= (EditText) itemView.findViewById(R.id.et_num);mTvTotalPrice= (TextView) itemView.findViewById(R.id.tv_total_price);mTxtWatcher=new TxtWatcher();}public void setContent(int position,DataGoods data){mTvItemNo.setText(String.valueOf(position+1));mTvGoodsName.setText(data.getGoodsName());mTvPrice.setText(String.valueOf(data.getPrice()));mEtNum.setText(String.valueOf(data.getNum()));mTvTotalPrice.setText(String.valueOf(data.getTotalPrice()));mTxtWatcher.buildWatcher(position,mTvTotalPrice);mEtNum.setOnFocusChangeListener(new View.OnFocusChangeListener() {@Overridepublic void onFocusChange(View v, boolean hasFocus) {if(hasFocus){mEtNum.addTextChangedListener(mTxtWatcher);}else{mEtNum.removeTextChangedListener(mTxtWatcher);}}});}}public class TxtWatcher implements TextWatcher{private int mPosition;private TextView mTvTotalPrice;public void buildWatcher(int position,TextView view){this.mPosition=position;this.mTvTotalPrice=view;}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {if(s.length()>0){if(mListener!=null){mListener.onEditTextChanged(mPosition,s.toString());mTvTotalPrice.setText(String.valueOf(mDatas.get(mPosition).getPrice()*Double.parseDouble(s.toString())));}}else{if(mListener!=null){mListener.onEditTextChanged(mPosition,"0");mTvTotalPrice.setText("0");}}}@Overridepublic void afterTextChanged(Editable s) {}}}

四、選擇RecyclerView而不是ListView的原因

? ? ? ??RecyclerView 在滑動的時候會使EditText失去焦點,這樣可以觸發OnFocusChangeListener,這樣可以更準確的綁定和解綁TxtWatcher。為什么要解綁TxtWatcher?因為在RecyclerView刷新的時候會重復觸發TextWatcher導致很多次無用的回調(甚至死循環)。

? ? ? ? ListView在滑動的時候不會使EditText失去焦點,導致了滑動時輸入框焦點錯位,并且因為輸入框是復用的所以導致TextWatcher重復觸發很多次(可能是死循環)。

五、注意在布局中設置列表是盡量降低RecyclerView布局重繪的可能性(例如:固定大小等等)

轉載于:https://www.cnblogs.com/zhujiabin/p/8176915.html

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

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

相關文章

workbench拓撲優化教程_優化技術在水泵水力設計的應用(上篇)

文章來源&#xff1a;安世亞太官方訂閱號&#xff08;搜索&#xff1a;Peraglobal&#xff09;CFD技術在泵的內流數值模擬、研究泵內部流動規律和結構方面已廣泛應用&#xff0c;取得了很多成果。但是初步設計的產品如果通過CFD仿真得到的性能曲線不能滿足使用要求&#xff0c;…

深度學習之 TensorRT

1 簡介 TensorRT是一個高性能的深度學習推理&#xff08;Inference&#xff09;優化器&#xff0c;可以為深度學習應用提供低延遲、高吞吐率的部署推理。TensorRT可用于對超大規模數據中心、嵌入式平臺或自動駕駛平臺進行推理加速。TensorRT現已能支持TensorFlow、Caffe、Mxne…

H.264筆記

H.264標準寫得比較繁復&#xff0c;所以考慮在瀏覽完Whitepaper之后就開始研讀X264代碼。X264代碼風格還是比較清晰簡潔的。根據對標準得理解&#xff0c;Picture Order Count在Slice解碼的一開始就被提及&#xff1a;I0 B1 B2 P3 B4 B5 P6I0 P3 B1 B2 P6 B4 B5于是I0的POC是0&…

進制轉換中dbho是什么意思_什么是網段?二進制十進制如何互相轉換?看完這篇,你就全明白了...

之前的文章講了ip&#xff0c;子網掩碼&#xff0c;網關的關系&#xff0c;今天著重講一下網段。我們用傻瓜交換機通訊時&#xff0c;一個網段的設備才能互相通訊&#xff0c;怎么能判斷兩個ip是同一個網段呢&#xff1f;今天就簡單的說一下。(這篇文章用語音聽可以起到催眠作用…

【網絡流24題】星際轉移問題(最大流)

【網絡流24題】星際轉移問題&#xff08;最大流&#xff09; 題面 Cogs 題解 因為天數是未知的&#xff0c;所以我們要想辦法處理天數 可以選擇二分或者依次累加天數 因為數據范圍較小&#xff0c;使用二分可能反而復雜度會增高 所以使用不斷累加天數 那么&#xff0c;把所有的…

使用 gunicorn 部署flask項目

1、WSGI協議 Web框架致力于如何生成HTML代碼&#xff0c;而Web服務器用于處理和響應HTTP請求。Web框架和Web服務器之間的通信&#xff0c;需要一套雙方都遵守的接口協議。WSGI協議就是用來統一這兩者的接口的。 2、WSGI容器 常用的WSGI容器有Gunicorn和uWSGI&#xff0c;但G…

軟件需求與問題解決

&#xff08;一&#xff09; 小滿當上項目經理后不久&#xff0c;參與了一個大項目。當時市場簽下來的時候&#xff0c;公司里面是歡天喜地的。項目做了一年多。到了交付的時候&#xff0c;用戶卻很不滿意&#xff0c;當初說好的東西&#xff0c;好多都變了卦。用戶是上帝&…

flex 換主軸后子元素占滿_Chrome72 嵌套 flex 布局修改,你的網站可能會發生布局錯亂...

起源2019 年 1 月 29 日&#xff0c;Chrome72 正式版(72.0.3626.81)發布&#xff0c;本次發布帶來了一個改變&#xff0c;且沒有在更新日志中提及&#xff0c;該改變導致某些網站發生了布局錯亂。該改變主要針對的是嵌套的flex布局&#xff0c;下面我們一起看下是怎么回事。問題…

使用 Django + Wusgi + Nginx 部署 Django

如何在生產上部署Django? Django的部署可以有很多方式&#xff0c;采用 nginxuwsgi 的方式是其中比較常見的一種方式。 uwsgi介紹 uWSGI是一個Web服務器&#xff0c;它實現了WSGI協議、uwsgi、http等協議。Nginx中HttpUwsgiModule的作用是與uWSGI服務器進行交換。 WSGI / …

網絡學習網址

網絡之路博客 http://ccieh3c.com/ 轉載于:https://www.cnblogs.com/changha0/p/8179801.html

路由到另外一個頁面_Nextjs使用解讀一(項目搭建與路由系統)

文章說明&#xff1a;1. 之前想搭建個人博客&#xff0c;由于學習的是react技術棧&#xff0c;所以就到處搜羅資料學了nextjs&#xff0c;配合koa就把博客搭起來了。該系列文章基于我的學習筆記&#xff0c;重新整理了一遍&#xff0c;如果有錯誤之處&#xff0c;還請指正。2. …

微信獲取token -1000

最終翻看微信開發api找到需要去配置IP白名單。只需要配置訪問來源IP即可。 轉載于:https://www.cnblogs.com/yangjinqiang/p/8184663.html

產品技術和管理

為啥純粹為消費者傳遞體驗的活動可以價格不菲&#xff0c;幾為暴利&#xff1f;——談客戶體驗作為客戶價值提升之源 不論產品還是服務&#xff0c;如果能夠為消費者傳遞有益的體驗&#xff0c;其價值就可以在一般的產品服務之上得以體現&#xff1b;附加了體驗的產品&#xff…

Linux 修改系統編碼

linux服務器的字符集設置可能影響到網站頁面出現 “&#xff1f;&#xff1f;&#xff1f;” 等問號亂碼&#xff0c;還有可能導致文件中的漢字部分出現亂碼。有兩個原因 服務器沒有安裝 zh_CN.UTF-8 字符集&#xff0c;導致不支持中文&#xff01;服務器雖然裝了 zh_CN.UTF-8…

jquery ztree 設置勾選_047 JAVA-jQuery

jQuery操作元素屬性的值表單:<body><input type"button" name"" id"but1" value"測試獲得屬性值" /><hr />賬號&#xff1a;<input type"text" name"sxtzh" id"zhanghao" value&q…

Opencv undefined reference to `cv::imread() Ubuntu編譯

Ubuntu下編譯一個C文件&#xff0c;C源程序中使用了opencv&#xff0c;opencv的安裝沒有問題&#xff0c;但是在編譯的過程中出現如下錯誤&#xff1a; undefined reference to cv::imread(std::string const&, int)undefined reference to cv::noArray()undefined referen…

深度學習目標檢測之 YOLO v1

這是繼 RCNN&#xff0c;fast-RCNN 和 faster-RCNN 之后&#xff0c;rbg&#xff08;RossGirshick&#xff09;針對DL目標檢測速度問題提出的另外一種框架。YOLO V1 增強版本GPU中能跑45fps&#xff0c;簡化版本155fps。 論文名&#xff1a; 《You Only Look Once&#xff1a;…

編程珠璣番外篇

1.Plan 9 的八卦 在 Windows 下喜歡用 FTP 的同學抱怨 Linux 下面沒有如 LeapFTP 那樣的方便的工具. 在蘋果下面用慣了 Cyberduck 的同學可能也會抱怨 Linux 下面使用 FTP 和 SFTP 是一件麻煩的事情. 其實一點都不麻煩, 因為在 LINUX 系統上壓根就不需要用 FTP. 為什么呢? 因…

BT下載原理分析

版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 BitTorrent協議。 BT全名為BitTorrent,是一個p2p軟件,你在下載download的同時&#xff0c;也在為其他用戶提供上傳upload&#xff0c;因為大家是“互相幫助”&#xff0c;所以不會隨著用戶數的增加而…

表格列求和_excel表格制作,Excel表格的基本操作,包含制作一個表格10方面的知識...

創建表格&#xff0c;插入與刪除一行一列或多行多行&#xff0c;一次移動一行一列或多行多列&#xff0c;拆分與合并單元格&#xff0c;單元格內換行&#xff0c;表格求和與求平均值是Excel表格的基本操作&#xff1b;除此之外&#xff0c;Excel表格的基本操作還包括調整行高列…