解决recycleview动态添加条目后,item上的edit输入数据造成的数据错乱
来源:互联网 发布:tensorflow 人脸比对 编辑:程序博客网 时间:2024/05/20 04:13
动态添加条目的时候,在item的edit上输入数据,再此添加条目会导致条目位置错乱,数据移位;下面是解决方法:共两种方法可以解决错乱问题
下面是完整代码可以直接创建一个项目看效果
例子如下
package com.example.administrator.demo;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;import android.widget.TextView;import java.util.ArrayList;import java.util.List;import static com.example.administrator.demo.R.id.add_option;public class RadioActivity extends AppCompatActivity { private RecyclerView optionView; TextView addOption; OptionAdapter optionAdapter; private List<String> mData = new ArrayList<>(); @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.radio); addOption = (TextView) findViewById(add_option); optionView = (RecyclerView) findViewById(R.id.option_list_view); optionAdapter = new OptionAdapter(this, mData);// 集合传入 final LinearLayoutManager layoutManager = new LinearLayoutManager(this); optionView.setLayoutManager(layoutManager); optionView.setAdapter(optionAdapter); // 删除条目的监听 同时删除对应位置的数据 optionAdapter.setOnAdapterClick(new OptionAdapter.OnOptionListAdapterClick() { @Override public void onDel(int position) { updateData(); mData.remove(position); optionAdapter.notifyDataSetChanged(); } }); /** * 添加条目 */ addOption.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { addOption(); } }); } private void updateData() {
//这是第二种方法 在这里注释掉// mData.clear();// for (int i = 0; i < optionView.getChildCount(); i++) {// LinearLayout layout = (LinearLayout) optionView.getChildAt(i);// 获得子item的layout// EditText et = (EditText) layout.findViewById(R.id.edit_text);// 从layout中获得控件,根据其id// mData.add(et.getText().toString());// } } void addOption() { updateData(); mData.add(""); optionAdapter.notifyDataSetChanged();// 刷新一下适配器数据 }}
接下来是适配器类
xml:package com.example.administrator.demo;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.text.Editable;import android.text.TextUtils;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.List;/** * 用来增加和删除单选项目的条数 集合的第一个位置下标是1 Created by Administrator on 2016/12/17. */ class OptionAdapter extends RecyclerView.Adapter<OptionAdapter.MyOptionViewHolder> { private Context context; private List<String> mData; OptionAdapter(Context context, List<String> mData) { this.context = context; this.mData = mData; } @Override public MyOptionViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new MyOptionViewHolder(LayoutInflater.from(context).inflate(R.layout.option_item, parent, false)); } @Override public void onBindViewHolder(final MyOptionViewHolder holder, final int position) { holder.optionName.setText("选项" + (position + 1) + ":"); // 删除监听 holder.delete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mAdapterClick.onDel(position);// 删除列表的第一个位置 } }); holder.editText.setTag(position);//防止下标越界 if (mData != null && position > -1 && position < mData.size() && !TextUtils.isEmpty(mData.get(position))) { holder.editText.setText((mData.get(position))); } else { holder.editText.setText(null); } } @Override public int getItemCount() { return mData.size(); } class MyOptionViewHolder extends RecyclerView.ViewHolder { EditText editText; TextView optionName; TextView delete; MyOptionViewHolder(View itemView) { super(itemView); editText = (EditText) itemView.findViewById(R.id.edit_text); optionName = (TextView) itemView.findViewById(R.id.option_name); delete = (TextView) itemView.findViewById(R.id.delete);//在这里获取到edit的监听事件
editText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { Object object = editText.getTag(); if (object != null && object instanceof Integer) { int position = ((Integer)object); mData.remove(position); mData.add(position, s.toString()); } } }); } } private OnOptionListAdapterClick mAdapterClick; interface OnOptionListAdapterClick { void onDel(int position);// 接口里的抽象方法 } // 构造方法 用来回传事件 void setOnAdapterClick(OnOptionListAdapterClick adapterClick) { mAdapterClick = adapterClick; }}
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="match_parent" android:layout_height="10dp" /> <EditText android:layout_marginStart="10dp" android:id="@+id/edit_title" android:gravity="top" android:layout_width="match_parent" android:layout_height="80dp" /> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/number" android:layout_gravity="end" android:textSize="16sp" android:layout_marginEnd="35dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:layout_gravity="end" android:textSize="16sp" android:layout_marginEnd="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </FrameLayout> <TextView android:layout_width="match_parent" android:layout_height="10dp" /> <android.support.v7.widget.RecyclerView android:id="@+id/option_list_view" android:layout_width="match_parent" android:layout_weight="1" android:layout_height="0dp"/> <TextView android:id="@+id/add_option" android:gravity="end|center_vertical" android:layout_gravity="end" android:text="添加" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <TextView android:id="@+id/save" android:text="保存集合" android:layout_width="match_parent" android:layout_height="wrap_content" /></LinearLayout>
阅读全文
1 0
- 解决recycleview动态添加条目后,item上的edit输入数据造成的数据错乱
- 记录RecycleView的数据错乱BUG解决
- RecycleView的Item数据出现随机错乱重复问题解决
- 当发现不能读取页面上输入的数据时可能是什么原因造成的,怎么解决?.
- Android 解决ListView插入其他布局条目(item或广告)删掉数据的问题
- listview复用后数据错乱问题的解决
- ListView 数据错乱问题的解决(CheckBox)
- Android 解决Listview条目里面有Edittext数据错乱问题
- Listview滑动过程中item出现数据错乱的解决方法
- android开发 recycleview的item中加入checkbox实现批量选择条目(复用时防止checkbox勾选状态错乱)
- 解决PostMessage发送字符串造成数据错乱问题
- RecycleView的多条目
- recycleview嵌套recycleview,并获取item点击的状态和数据
- recycleview 滑动之后显示数据错乱
- 数据中心 FailOver 后避免数据错乱的关键做法
- RecycleView添加条目布局match_parent失效的问题
- RecycleView不同类型Item&添加HeaderView&条目点击事件
- listView 条目错乱的问题
- 7月份月报总结
- Android SDcard 文件读写,RandomAccessFile操作
- Yii2 自动分表 model
- Storm学习之Trident:笔记(一)聚合操作
- js面试常考算法
- 解决recycleview动态添加条目后,item上的edit输入数据造成的数据错乱
- 一个demo学会js
- android jni 用c++使用opengles和egl实现离屏渲染
- 开博啦~~ 算法服务平台-10001
- 正则表达式
- iOS TextView输入长度限制 设置placeholder
- 【算法题一】 百钱买百鸡
- vim配置文件,让编程更随意
- POJ1542 Ultra-QuickSort