【问题标题】:have button to delete everything in recyclerview but when add new cardview, same cardviews有按钮可以删除 recyclerview 中的所有内容,但是当添加新的卡片视图时,相同的卡片视图
【发布时间】:2018-10-03 15:12:30
【问题描述】:

注意:我之前也遇到过这个问题,这里deleting all cardviews from recyclerview then adding new cardviews - adds same cardviews

当用户按下 FAB 时,一个 cardview 被添加到 recyclerview 中。每个卡片视图内部都有一个复选框。我想这样当用户勾选特定卡片视图中的复选框时,该特定卡片视图被删除。

(仅供参考,每个卡片视图都有一个微调器和复选框以及一个文本视图和编辑文本)

我按了 fab 4 次,将 4 个卡片视图添加到我的屏幕上。然后我从微调器中挑选了不同的东西来看看发生了什么。

然后在我的溢出菜单中单击删除列表的按钮。它会删除每个卡片视图,所以我的屏幕现在是空白的,这很好,

但是当我开始添加更多卡片视图时,我注意到它在微调器中的值与应该被删除的值相同。

我在适配器中有这样的方法

public void reset() { 
   productList.clear(); 
   notifyDataSetChanged(); 
 }

就像我上面链接的问题答案一样,我尝试添加

holder.spinner.setSelection(0);

于是就变成了

public void reset() {


        holder.spinner.setSelection(0);

        productList.clear();
        notifyDataSetChanged();

    }

但现在是cannot resolve symbol holder

我该怎么办?

这是我的完整 productadapter.java 代码

public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ProductViewHolder> {

    private Map<Integer, Integer> mSpinnerSelectedItem = new HashMap<Integer, Integer>();

    private Map<String, String> numberItemValues = new HashMap<>();

    private List<Product> productList;

    private Activity create;


    //TODO CODE FOR CSV FILE


    InputStream inputStream = null;
    List<String>  mSpinnerItems = null;
    CSVFile csvFile = null;


    //TODO END OF CODE FOR CSV FILE

    public ProductAdapter(Activity activity) {
        create = activity;

    }



    public ProductAdapter(Activity activity, List<Product> productList, Map<String, String> numberList) {
        numberItemValues = numberList;
        create = activity;
        this.productList = productList;
    }

    @Override
    public ProductViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //inflating and returning our view holder
        LayoutInflater inflater = LayoutInflater.from(create);
        View view = inflater.inflate(R.layout.layout_products, null);
        return new ProductViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final ProductViewHolder holder, final int position) {


        ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(create, R.layout.item_spinner_layout,
                Product.getSpinnerItemsList());
        spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        holder.spinner.setAdapter(spinnerArrayAdapter);

        holder.spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int mPosition, long id) {
                mSpinnerSelectedItem.put(position, mPosition);

                TextView mTextView = view.findViewById(R.id.mSpinnerText);

                String currentItem = holder.spinner.getItemAtPosition(mPosition).toString();

                Set<String> set = numberItemValues.keySet(); for(String key : set) {String value = numberItemValues.get(key); Log.e("DATA ", "key = " + key + " value = " + value); }

                String aisleNumber = numberItemValues.get(currentItem);
                holder.textView5.setText(aisleNumber);

                Log.e("SELECTION TEST", " Selected map item = " + aisleNumber );

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

        //binding the data with the viewholder views
        if (mSpinnerSelectedItem.containsKey(position)) {
            holder.spinner.setSelection(mSpinnerSelectedItem.get(position));
        }


        holder.getView().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(create);


                // set title
                alertDialogBuilder.setTitle("Delete Item");

                // set dialog message
                alertDialogBuilder
                        .setMessage("Are you sure you want to delete this item?")
                        .setCancelable(false)
                        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // if this button is clicked, close
                                // current activity


                                holder.checkBox.setChecked(false);
                                holder.spinner.setSelection(0);

                                productList.remove(holder.getAdapterPosition());
                                notifyItemRemoved(holder.getAdapterPosition());

                                Toast.makeText(create, "Item removed.", Toast.LENGTH_LONG).show();


                            }
                        })
                        .setNegativeButton("No", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // if this button is clicked, just close
                                // the dialog box and do nothing
                                dialog.cancel();
                            }
                        });

                // create alert dialog
                AlertDialog alertDialog = alertDialogBuilder.create();

                // show it
                alertDialog.show();

            }
        });

    }


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

    public void reset() {


        holder.checkBox.setChecked(false);
        holder.spinner.setSelection(0);

        productList.clear();
        notifyDataSetChanged();

    }

    class ProductViewHolder extends RecyclerView.ViewHolder {

        SearchableSpinner spinner;
        EditText editText;
        TextView textView5;
        CheckBox checkBox;
        LinearLayout linearLayout;
        View rootView;


        public ProductViewHolder(View itemView) {
            super(itemView);

            spinner = itemView.findViewById(R.id.spinner);
            editText = itemView.findViewById(R.id.editText);
            textView5 = itemView.findViewById(R.id.textView5);
            checkBox = itemView.findViewById(R.id.checkBox);
            rootView = itemView.findViewById(R.id.linearLayout);


            checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    // makes the set disappear when checkbox is ticked.
                    if(isChecked){

                        checkBox.setChecked(false);
                        spinner.setSelection(0);

                        productList.remove(getAdapterPosition());
                        notifyItemRemoved(getAdapterPosition());



                        Toast.makeText(create, "Done!", Toast.LENGTH_LONG).show();
                    }

                }
            });



        }

        public View getView() {
            return rootView;
        }

    }


    //TODO CODE FOR CSV FILE
    private class CSVFile {
        InputStream inputStream;

        public CSVFile(InputStream inputStream) {
            this.inputStream = inputStream;
        }

        public List<String> read() {
            List<String> resultList = new ArrayList<String>();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            try {
                String line;
                while ((line = reader.readLine()) != null) {
                    String[] row = line.split(",");

                    numberItemValues.put(row[1], row[0]);

                    resultList.add(row[1]);
                }
            } catch (IOException e) {
                Log.e("Main", e.getMessage());
            } finally {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    Log.e("Main", e.getMessage());
                }
            }
            return resultList;
        }
    }


}

【问题讨论】:

  • 请清理您的代码以提高可读性。
  • 完成;删除了无用的代码块 cmets 和空格
  • 你正在从活动中调用重置?
  • 在活动代码中我会像((ProductAdapter) recyclerView.getAdapter()).reset();
  • 按下按钮时

标签: android android-recyclerview


【解决方案1】:

我认为这里的问题是 recyclerview 正在重用已经创建的视图。

在 ViewHolder 中创建一个重置方法

public void reset() {
   textview5.setText("");
   edittext.setText("");
   // Add other variable too if needed
}

然后在设置数据之前在onBindView()调用这个方法。

@Override
public void onBindViewHolder(final ProductViewHolder holder, final int position) {

    // reseting view
    holder.reset();

   // rest of your code...
}

【讨论】:

    猜你喜欢
    • 2020-12-18
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多