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.mzph.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表格的基本操作还包括调整行高列…