Android RecyclerView嵌套EditView实时更新Item数据

Spark(8) -- SparkCore(2) -- RDD创建 1. RDD的三种创建方式 2. 并行化集合 3. 外部存储系统 4. 小文件读取 5. RDD分区数目 阅读详情

一、场景(例如:购物车)

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

    @Override
    protected 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);
    }

    @Override
    public 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;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new EditAbleListViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_editable_view,null));
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        ((EditAbleListViewHolder)holder).setContent(position,mDatas.get(position));

    }

    @Override
    public 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() {
                @Override
                public 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;
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public 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");
                }
            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    }



}

四、选择RecyclerView而不是ListView的原因

        RecyclerView 在滑动的时候会使EditText失去焦点,这样可以触发OnFocusChangeListener,这样可以更准确的绑定和解绑TxtWatcher。为什么要解绑TxtWatcher?因为在RecyclerView刷新的时候会重复触发TextWatcher导致很多次无用的回调(甚至死循环)。

        ListView在滑动的时候不会使EditText失去焦点,导致了滑动时输入框焦点错位,并且因为输入框是复用的所以导致TextWatcher重复触发很多次(可能是死循环)。

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

转载  Android RecyclerView嵌套EditView实时更新Item数据 - 星辰之力 - 博客园

dbt+Snowflake实战:数据建模、权限隔离与性能优化全指南 dbt(data build tool)作为现代数据栈的核心建模工具,其与Snowflake的深度协同远不止于SQL编译执行——它本质是将软件工程实践(如版本控制、测试驱动、CI/CD)注入数据交付流程。理解dbt的声明式建模原理与Snowflake的虚拟仓库、Time Travel、TRANSIENT表、聚簇键等底层机制如何咬合,是实现可维护、可审计、低成本数据产品交付的关键。本文聚焦dbt在Snowflake环境中的真实落地挑战,涵盖schema与warehouse的物理映射设计、role级硬隔离策略、 阅读详情

相关推荐

vivado2025安装教程:手把手带你完成环境配置

详细讲解vivado2025的安装步骤与环境配置技巧,帮助开发者快速搭建FPGA开发平台。涵盖常见问题解决方案,确保vivado2025稳定运行,提升开发效率。

weixin_42588672的博客 3029

Android RecyclerView 子条目(item)嵌套 RecyclerView

要实现的效果: MainActivity核心代码: LinearLayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); mTvRecycler.setLayoutManager(layoutManager); m...

小红妹 6982

RK3568—基于GM8775C的MIPI转双通道LVDS屏幕调试

Rockchip RK3568 原生显示接口不支持双通道LVDS屏幕的数据输出,因此需要借助显示转换芯片才能实现双通道LVDS屏幕的驱动。本文介绍使用GM8775C芯片方案,在 RK3568 平台实现单路 MIPI DSI 信号输出来驱动双通道LVDS显示屏。 关于GM8775C GM8775C 型 DSI 转双通道 LVDS 发送器产品主要实现将 MIPI DSI 转单/双通道 LVDS功能,MIPI 支持 1/2/3/4 通道可选,每通道最高支持 1Gbps 速率,最大支持 4Gbps 速率。LV.

Industio_优快云的博客 1万+

recyclerview嵌套recyclerivew,单独刷新子recyclerview导致父recyclerview滑动到顶部的解决方法

1.在父recyclerview添加一行 android:descendantFocusability="afterDescendants" 2.在子recyclerview添加 android:focusable="true" android:focusableInTouchMode="true" ...

qq_38373150的博客 1823

UA-DETRAC数据集转YOLO格式

UA-DETRAC转YOLO

lafsca5的博客 9108

从 0 到 1 构建 Graph RAG 系统:本地图谱 + 通义千问落地实践

本文介绍了一个基于知识图谱的检索增强生成系统(Graph RAG),该系统结合领域知识图谱、语义检索和大模型问答,旨在提供结构化、精准的技术问答服务。文章详细说明了项目背景、目标、核心技术架构以及实现方法,包括本地图谱构建、Neo4j数据库接入、语义检索和大模型集成等关键环节。该系统支持混合检索、多轮问答和知识图谱关联理解,能够有效减少大模型幻觉,提升问答的准确性和可解释性。文中还展示了核心代码结构和流程图,呈现了从文档加载到图谱构建再到问答生成的完整流程。该系统适用于需要处理复杂领域知识的研发和数据分析场

m0_58378112的博客 1402

recyclerview嵌套recyclerview刷新_Android 支持刷新、加载更多、带反弹效果的RecyclerView...

点击上方“Android技术杂货铺”,选择“标星”干货文章,第一时间送达!开篇当前市面上很多支持刷新、加载更多RecyclerView开源库,为何我这里还要自己再写一个?因为市面上的这些支持刷新加载更多的RecyclerView开源库实现方式基本上都是:在Adapter的外层在包裹一层Adapter,这种实现方式主要有以下两个不方便。1、在用户添加ItemDecoration的时候,会影...

weixin_39597399的博客 804

xtop:multi_driven_net与incomplete_timing_cell fail reason 分析

man multi_driven_net”可以得知,这个问题是multi driven结构引起的,使用命令“get_failed_pins -reason multi_driven_net”,获取violation pin。“man incomplete_timing_cell”可以得知,这个fail reason的原因是缺少timing library cell,检查并补全后这个错误就显示了。这里选择的解决方法是修改lib文件,把inout改成input,重新lib2idb。通过这种方法解决了问题。

m0_61544122的博客 567

Recyclerview 刷新

前言:recyclerview比起listview功能上更加丰富外(如横向列表),在Item复用上也更加灵活,比如listview的某个Item数据需要更新,要通过notifyDataSetChanged方法对全部Item进行刷新,而recyclerview则可以精准刷新。 介绍: (1)notifyItemChanged(position) 只刷新该position的Item,即只是该Item调用onBindViewHolder,因此如果对数据源进行插、移除操作不能改方法只刷新操作的Item,毕竟该

yufumatou的博客 4837

FM20S用户手册--Linux系统启动卡制作及系统固化

评估板出厂时,默认提供一张配套的Micro SD卡,此卡为可正常使用的Linux系统 启动卡。评估板断电,将Linux系统启动卡插入评估板Micro SD卡槽,根据评估底板丝印将 启动方式选择拨码开关拨为1010(1-4).此档位为Micro SD启动模式。使用Linux 系统启动卡启动系统时,将使用此目录的BOOTbn文件启动FSBL和U-Boot。Linux系统启动卡制作时,已将固化系统的脚本文件mkemmcboot.sh拷贝至Linux系 统启动卡文件系统的"/opt/tools/"目录下。

创龙,嵌入式一体化解决方案商 302

18、基于FSDD数据集的深度学习案例分析

本文基于FSDD(Free Spoken Digit Dataset)数据集,系统介绍了深度学习在语音数字识别中的应用。内容涵盖动态与静态计算图的对比、数据预处理流程(包括数据增强、固定长度处理和归一化)、监督学习与无监督学习的模型构建与训练过程,并通过实验对比了不同网络架构的性能。文中使用PyTorch实现2层全连接网络和自编码器模型,展示了正则化技术对提升模型准确率的关键作用。最后总结了关键技术并提出了实际应用建议,展望了未来在复杂模型、多模态融合和实时应用方向的发展潜力。

vscode6remote的博客 260

RecyclerView Item Edit 复用问题

RecyclerView Item Edit 复用问题 RecyclerView 列表控件 传承了ListView GridView Item 复用的机制 在滑动屏幕时更新数据 共用一套或者特定的几套View Holder展示数据 。。。 ViewHolder 加载数据 Item 加载List 展示数据 Item 中包含交互输入的View List数据交互 Item 中包含交互输入的Vie...

Fr,manba 的博客 620

十五、【测试执行篇】异步与并发:使用 Celery 实现测试任务的后台执行与结果回调

本文介绍如何使用Celery实现测试任务的异步执行与结果回调,解决同步执行测试计划导致的请求阻塞问题。主要内容包括:Celery的基本概念与工作原理(任务队列、消息中间件、Worker进程),在Django项目中集成Celery的步骤,以及将同步测试逻辑改造为异步任务的方法。

blues_C的博客 711

recyclerView + editTextView 编辑图片和文字标题 问题

要的效果是一个item包括图片和标题,添加图片后添加标题到list,当删除一个item时,所有的图片标题都变成一样的,都是postion为0的文本。 猜测是刷新adapter的时候,editTextView 的 文本监听又被调用了,但是不知道为什么文本都是第一个文本。 解决办法是,再给editTextView 加一个 焦点监听 ,聚焦的时候才去监听输入。 参考:Android RecyclerView嵌套EditView实时更新Item数据 - 星辰之力 - 博客园 ...

qq_37973828的博客 2389

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android -- RecyclerView中嵌套EditView

一、前言 在 RecyclerView 中使用 EditText 嵌套开发,是开发中经常遇到的,由于 RecyclerView 的回收复用机制导致 EditText 出现数据混乱 及 EditText TextWatcher 监听混乱等问题。 二、 RecyclerView 中嵌套 EditText 2.1 场景(例如:购物车) 1、当需要以列表样式管理某些数据时,可能需要列表项的某个字段可编辑 ...

一只驴在敲代码 3165

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android 跳转的时候默认焦点,RecyclerView焦点跳转BUG优化的方法

我们把RecyclerView写成GridView样式,并把RecyclerView的item写成focusable并且有焦点框的时候,我们用焦点滚动RecyclerView的时候会发现RecyclerView的焦点跳转有bug,跟我们想要的焦点跳转规则不一致,会出现的BUG如下图:黑色方框代表屏幕,我们从左上角的一个item往下按焦点的时候,当需要加载新的一行的时候焦点却跑到了新的一行的最后一个...

weixin_35808305的博客 503

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android edittext 切换焦点或获取焦点时 ,多个eidttext 设置光标到最后一位

Android edittext 切换焦点或获取焦点时 设置光标到最后一位 先说设置光标到最后一位的代码,其实很简单 editText.setSelection(editText.getText().length()); 但是,我们经常用到的情况是,当edittext获取焦点时,光标会默认显示在第一位,需要将光标自动移动到最后一位,这时候就需要在监听事件中设置了 edittext 焦点监听 中设置光标位置 editText.setOnFocusChangeListener(new View.OnFoc

Runt02的博客 6782

笔记--RecyclerView设置默认焦点

@BindView(R.id.rv_question) RecyclerView rvQuestion; new Handler().postDelayed(new Runnable() { @Override public void run() { RecyclerView.ViewHolder holder = rvQuestion.findViewHolderForAdapterPosition(0); rvQuestion.requestFocu.

Android_Amelia的专栏 2047

解决 recycleview为editText添加afterTextChanged监听刷新数据错乱

原因:recycleview的复用机制 方法一:强制停用Recyclerview的复用 holder.setIsRecyclable(false);//防止editText数据错乱 方法二:在onBindViewHolder()中判断EditText是否获取了焦点,只有在获取焦点了在进行内容的改变。 if (addItemTextChanged != null) { ...

Zero_uou的博客 2324

edittext在哪可以获取有效值_Android 中获取 RecycleView列表Item的EditText控件的值

在帮朋友做的一个小项目中,发现了这么的一个需求:要求列表中的某一项是可编辑输入的,说实话,做了差不多两年android开发,我还是第一次做列表中的item是可以输入编辑的,只能说我们的需求确实是变化莫测........不多说,继续记录一下实现过程1、实现思路在adapter中保存一个Hashmap,同时监听EditText控件的输入,然后保存相对应的值2、核心代码public class Purc...

weixin_35006433的博客 467

Android RecyclerView嵌套RecyclerView

原理 RecyclerView嵌套RecyclerView的条目,项目中可能会经常有这样的需求,但是我们将子条目设置为RecyclerView之后,却显示不出来。自己试了很久,终于找到了原因:必须先设置子RecylcerView的高度。你要花精力确定出子RecyclerView里面条目的高度,然后从而确定子RecyclerView的高度,设置给子RecylcerView,这样做RecyclerV...

tasty 1万+

Android中RecyclerView嵌套RecyclerView

前言这两天在做一个新的APP,在考虑用户体验上要一个两级的列表嵌套,于就想看看RecyclerView是否能做出这样的效果,自己写了一个DEMO来做一下测试,最后的效果还是比较满意的。下...

Vaccae的博客 1696

Android RecyclerView 中多Item的EditText焦点混乱,数据错乱的解决方法(更新)

最近在做毕业设计,使用了RecyclerView来做了以下个人资料的编辑界面。RecyclerView中包含了多种不同的Item,例如图片里面的 姓名,公司,部门,职位,邮箱的Item 里面都包含一个EditText。 RecyclerView中EditText的监听处理这个界面的主要逻辑是监听每个EditText的输入,然后保存到个人对象里,最后保存到服务器上。RecyclerView中Item

qq402164452的博客 1万+

android 控制焦点,Android应用开发:NO.2--RecyclerView 焦点控制

本文主要介绍了Android应用开发的NO.2--RecyclerView 焦点控制,希望对大家学习Android应用开发有所帮助。android TV使用 RecyclerView ,用焦点控制item首先在item中的xml中,的最外层添加 android:focusable="true",此句是为RecyclerView 的item添加焦点属性,添加完属性后,在RecyclerView 的 ...

weixin_35719380的博客 1607

RecyclerView焦点循环切换的方法

RecyclerView焦点循环切换的方法 RecyclerView我们使用的很多了,做TV开发的时候,当焦点在第一项时按上键希望能跳到最后一项,焦点在最后一项时按下键跳到第一项,recyclerView没有这个功能的,现在就介绍如何实现这个功能。 1,在recyclerView的adapter的on...

wujiang_android的博客 2163
上一篇: 2021年最新Android中高进阶面试集锦
下一篇: tomcat https双向认证(包含PC端和移动端操作)
Angus博客
Angus博客 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄12年 557粉丝 282原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值