清除RecyclerView行中的EditText值

时间:2017-05-14 06:32:27

标签: android android-recyclerview

我的android项目中有一个RecyclerView。在那里,我从AutoCompleteTextView搜索添加行。每行都有TextView和一个EditText字段。除了添加,我还删除行。我在每一行都有一个删除按钮。

一切正常。问题是我无法在删除时清除EditText值。例如,如果我添加三行并删除第二行,则第三行应该具有自己的EditText值到达第二位。但问题是,删除的行中的值未清除,而第三行的EditText值则替换为它。然后,如果我添加另一行(到第三位),则EditText字段自动填充前三行的EditText值。

如何清除EditText值???

这是我的适配器代码。

public class SelectItemAdapter extends RecyclerView.Adapter<SelectItemAdapter.ItemHolder> {

    private List<String> itemsName, itemsQty, itemsPCode, itemPlant, _retData;
    private OnItemClickListener onItemClickListener;
    private LayoutInflater layoutInflater;
    private String[] mDataset;
    public ArrayList myItems = new ArrayList();
    private Context context;
    private String[] arrayForSaveEditTextValue;

    public SelectItemAdapter(Context context, String[] mDataset) {
        layoutInflater = LayoutInflater.from(context);
        itemsName = new ArrayList<String>();
        itemsQty = new ArrayList<String>();
        itemsPCode = new ArrayList<String>();
        itemPlant = new ArrayList<String>();
        _retData = new ArrayList<String>();
        this.arrayForSaveEditTextValue = mDataset;
    }

    @Override
    public SelectItemAdapter.ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = layoutInflater.inflate(R.layout.custom_row_selected_item, parent, false);
        return new ItemHolder(itemView, this);
    }

    @Override
    public void onBindViewHolder(final SelectItemAdapter.ItemHolder holder, final int position) {
        holder.setItemName(itemsName.get(position));
        holder.setItemQty(itemsQty.get(position));
        holder.setItemPCode(itemsPCode.get(position));
        holder.setItemPlant(itemPlant.get(position));
        holder.numPicker.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,int arg3) {}

            @Override
            public void afterTextChanged(Editable arg0) {
                _retData.set(position, arg0.toString());
                Log.d("arg0",arg0.toString());
            }
        });
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }

    public String retrieveData(int i) {
        return _retData.get(i);
    }

    @Override
    public int getItemCount() {
        return itemsName.size();
    }

    public Object getItemName(int position) {
        return itemsName.get(position);
    }

    public Object getItemQty(int position) {
        return itemsQty.get(position);
    }

    public Object getItemPCode(int position) {
        return itemsPCode.get(position);
    }

    public Object getItemPlant(int position) {
        return itemPlant.get(position);
    }


    public void setOnItemClickListener(OnItemClickListener listener) {
        onItemClickListener = listener;
    }

    public OnItemClickListener getOnItemClickListener() {
        return onItemClickListener;
    }


    public interface OnItemClickListener {
        public void onItemClick(ItemHolder item, int position);
    }

    public void add(int location, String iName, String iQty, String iPCode, String iPlant) {
        itemsName.add(location, iName);
        itemsQty.add(location, iQty);
        itemsPCode.add(location, iPCode);
        itemPlant.add(location, iPlant);
        _retData.add(location,"0");
        notifyItemInserted(location);
        notifyDataSetChanged();
    }

    public void remove(int location) {
        if (location >= itemsName.size())
            return;

        itemsName.remove(location);
        itemsQty.remove(location);
        itemsPCode.remove(location);
        itemPlant.remove(location);
        _retData.remove(location);
        notifyItemRemoved(location);
        notifyDataSetChanged();
    }

    public static class ItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private SelectItemAdapter parent;
        TextView textItemName, txtPCode, txtAvailableQty, txtTempQty, txtPlant;
        Button bRemove;
        EditText numPicker;

        public ItemHolder(View itemView, SelectItemAdapter parent) {
            super(itemView);
            this.parent = parent;
            textItemName = (TextView) itemView.findViewById(R.id.txtProductName);
            txtAvailableQty = (TextView) itemView.findViewById(R.id.txtAvailbleQty);
            txtPCode = (TextView) itemView.findViewById(R.id.txtPCode);
            txtPlant = (TextView) itemView.findViewById(R.id.txtPlant);
            bRemove = (Button) itemView.findViewById(R.id.bRemove);
            numPicker = (EditText) itemView.findViewById(R.id.numberPicker);
            bRemove.setOnClickListener(this);
        }

        public void setItemName(CharSequence name) {
            textItemName.setText(name);
        }

        public void setItemQty(CharSequence name) {
            txtAvailableQty.setText(name);
        }

        public void setItemPCode(CharSequence name) {
            txtPCode.setText(name);
        }

        public void setItemPlant(CharSequence name) {
            txtPlant.setText(name);
        }

        public CharSequence getItemName() {
            return textItemName.getText();
        }

        @Override
        public void onClick(View v) {
            final OnItemClickListener listener = parent.getOnItemClickListener();
            if (listener != null) {
                listener.onItemClick(this, getPosition());
            }
        }
    }

    public class RetItem {
        public String _itemNumPic;
    }
}

删除方法......

@Override
public void onItemClick(SelectItemAdapter.ItemHolder item, int position) {
    Toast.makeText(this,
            "Remove " + " : " + item.getItemName(),
            Toast.LENGTH_SHORT).show();
    myRecyclerViewAdapter.remove(position);
}

3 个答案:

答案 0 :(得分:0)

首先使用Object的列表,而不是使用大量的string arrays! 然后要实现所需的行为,您需要从主列表中删除该项并调用notifyDataSetChanged();

这是一个例子:

List<DayEntity> days = new ArrayList<>();

以下是日期项目列表,您可以将此列表设置为适配器,如下所示:

MyDayAdapter adapter = new MyDayAdapter(context, days);

因此,删除位置上的项目&#39; x&#39;你可以这样做:

days.remove(x);
adapter.notifyDataSetChanged();

玩得开心......

答案 1 :(得分:0)

1-为您的数据创建一个模型类,将所有的getter和setter放在一个列表中:

public class SelectItemAdapter extends RecyclerView.Adapter<SelectItemAdapter.ItemHolder> {
    private final ArrayList<MyData> mDataList = new ArrayList<>();

2-删除方法

//Remove from the list on click
    private void removeAt(int position) {
        mUserList.remove(position);
        notifyItemRemoved(position);
        notifyItemRangeChanged(position, mDataList.size());
    }

3-现在在onClick()方法中你可以调用removeAt方法,你只需传递适配器位置的位置

             removeAt(getAdapterPosition());

答案 2 :(得分:0)

您需要跟踪EditText RecyclerView中输入的值。您有一个名为arrayForSaveEditTextValue的数组用于保存我认为的EditText值,但我认为没有使用它。你的代码也有点笨拙。所以我想建议一种不同的方法来为您实现此列表。

为列表项创建一个对象。

public class ListItem {
    public String itemsName;
    public String itemsQty; 
    public String itemsPCode;
    public String itemPlant;
    public String _retData;
    public String editTextValue = ""; // Default EditText Value
}

你的适配器看起来应该是这样的。

public class SelectItemAdapter extends RecyclerView.Adapter<SelectItemAdapter.ItemHolder> {

    private List<ListItem> listItems;
    private OnItemClickListener onItemClickListener;
    private LayoutInflater layoutInflater;

    public SelectItemAdapter(Context context, List<ListItem> listItems) {
        layoutInflater = LayoutInflater.from(context);
        this.listItems = listItems;
    }

    @Override
    public SelectItemAdapter.ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = layoutInflater.inflate(R.layout.custom_row_selected_item, parent, false);
        return new ItemHolder(itemView, this);
    }

    @Override
    public void onBindViewHolder(final SelectItemAdapter.ItemHolder holder, final int position) {

        final ListItem tempListItem = listItems.get(position);
        holder.textItemName.setText(tempListItem.itemsName);
        holder.txtAvailableQty.setText(tempListItem.itemsQty);
        holder.txtPCode.setText(tempListItem.itemsPCode);
        holder.txtPlant.setText(tempListItem.itemPlant);

        holder.numPicker.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
            }

            @Override
            public void afterTextChanged(Editable arg0) {

                // Calculate your _retData and set the TextView
                tempListItem._retData = calculateRetData(position, arg0.toString());
                tempListItem.editTextValue = arg0.toString();

                // Replace the item with the value updated
                listItems.add(position, tempListItem);
                notifyDataSetChanged();
            }
        });
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }

    @Override
    public int getItemCount() {
        return listItems.size();
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        onItemClickListener = listener;
    }

    public OnItemClickListener getOnItemClickListener() {
        return onItemClickListener;
    }


    public interface OnItemClickListener {
        public void onItemClick(ItemHolder item, int position);
    }

    public void add(ListItem listItem) {
        listItems.add(listItem);
        notifyDataSetChanged();
    }

    public void remove(int location) {
        if (location >= listItems.size())
            return;

        listItems.remove(location);
        notifyDataSetChanged();
    }

    public static class ItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private SelectItemAdapter parent;
        TextView textItemName, txtPCode, txtAvailableQty, txtTempQty, txtPlant;
        Button bRemove;
        EditText numPicker;

        public ItemHolder(View itemView, SelectItemAdapter parent) {
            super(itemView);
            this.parent = parent;
            textItemName = (TextView) itemView.findViewById(R.id.txtProductName);
            txtAvailableQty = (TextView) itemView.findViewById(R.id.txtAvailbleQty);
            txtPCode = (TextView) itemView.findViewById(R.id.txtPCode);
            txtPlant = (TextView) itemView.findViewById(R.id.txtPlant);
            bRemove = (Button) itemView.findViewById(R.id.bRemove);
            numPicker = (EditText) itemView.findViewById(R.id.numberPicker);
            bRemove.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            final OnItemClickListener listener = parent.getOnItemClickListener();
            if (listener != null) {
                listener.onItemClick(this, getPosition());
            }
        }
    }
}

我们的想法是将EditText值保存在相应的对象中,如果在RecyclerView中添加和删除项目,则必须相应地更新项目列表,然后调用{ {1}}。

我还没有对代码进行测试,但我认为你明白了。如果还有其他任何我可以帮助您的信息,请告诉我。