日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發(fā)布時(shí)間:2023/12/18 Android 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android RecyclerView嵌套EditView实时更新Item数据 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

1、當(dāng)我們需要以列表樣式管理某些數(shù)據(jù)時(shí),可能需要列表項(xiàng)的某個(gè)字段可編輯

2、編輯Item上的某個(gè)字段后可能還要更新相關(guān)字段的值

二、可能遇到的問題

1、列表滑動(dòng)導(dǎo)致輸入框中的數(shù)據(jù)錯(cuò)位(或者焦點(diǎn)錯(cuò)位)

2、無法更新Item上相關(guān)的字段項(xiàng)的值

3、監(jiān)聽輸入框文本更改時(shí)陷入死循環(huán)

三、可行方案(RecyclerView+TextWatcher

? ? ? ?1、用RecyclerView 實(shí)現(xiàn)一個(gè)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="" 此處或者回調(diào)前應(yīng)做值合法性驗(yàn)證="" mdatagoods.get(position).setnum(integer.parseint(value));="" <="" pre=""></mdatagoods.size();i++){></datagoods></datagoods>

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

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

? ? ? ?4、給EditText添加焦點(diǎn)變化的監(jiān)聽器,根據(jù)焦點(diǎn)狀態(tài)綁定和解綁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 在滑動(dòng)的時(shí)候會(huì)使EditText失去焦點(diǎn),這樣可以觸發(fā)OnFocusChangeListener,這樣可以更準(zhǔn)確的綁定和解綁TxtWatcher。為什么要解綁TxtWatcher?因?yàn)樵赗ecyclerView刷新的時(shí)候會(huì)重復(fù)觸發(fā)TextWatcher導(dǎo)致很多次無用的回調(diào)(甚至死循環(huán))。

? ? ? ? ListView在滑動(dòng)的時(shí)候不會(huì)使EditText失去焦點(diǎn),導(dǎo)致了滑動(dòng)時(shí)輸入框焦點(diǎn)錯(cuò)位,并且因?yàn)檩斎肟蚴菑?fù)用的所以導(dǎo)致TextWatcher重復(fù)觸發(fā)很多次(可能是死循環(huán))。

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

轉(zhuǎn)載于:https://www.cnblogs.com/zhujiabin/p/8176915.html

總結(jié)

以上是生活随笔為你收集整理的Android RecyclerView嵌套EditView实时更新Item数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。