动态添加条目的时候,在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>