解决recycleview动态添加条目后,item上的edit输入数据造成的数据错乱

动态添加条目的时候,在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();// 刷新一下适配器数据
   }
}
 
接下来是适配器类
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:


<?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>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值