解决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();// 刷新一下适配器数据   }}
接下来是适配器类
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>


阅读全文
1 0
原创粉丝点击