【问题标题】:How Do I Add Multiple CardView Layouts To A RecyclerView?如何将多个 CardView 布局添加到 RecyclerView?
【发布时间】:2021-09-14 10:11:21
【问题描述】:

这是我试图解释的应用程序行为的视频,以防万一您不理解我对问题的解释。请参阅下面的链接...

https://file.re/2021/09/14/2021-09-1405-16-22/

我正在尝试开发一个具有多个卡片视图布局的 Android 应用,这些布局将显示在一个回收站视图中。我没有太多运气让回收站视图列出我想要的布局。我可以添加第一个布局就好了,然后只要第一个卡片视图布局存在于回收站视图中就可以添加第二个布局。如果它在回收站视图中不存在,我首先尝试通过单击按钮添加第二个卡片视图布局来添加它几次,它将与第一个卡片视图布局一起添加。此外,当尝试从布局中删除卡片视图时,它们没有正确删除。这是我的 java 代码中的内容...

MainActivity.Java

public class MainActivity extends AppCompatActivity {

    ArrayList<RecyclerItem> addConverterCard = new ArrayList<>();

    private RecyclerView recyclerView;
    private RecyclerItemAdapter recyclerItemAdapter;
    private RecyclerView.LayoutManager layoutManager;

    public TextView ftocConverterLabelBtn, ftokConverterLabelBtn;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recycler_item_view);
        ftocConverterLabelBtn = findViewById(R.id.add_f_to_c_converter_label_btn);
        ftokConverterLabelBtn = findViewById(R.id.add_f_to_k_converter_label_btn);

ftocConverterLabelBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                if (clicked) {
                    addConverterCard.add(new RecyclerItem());
                    recyclerView.setHasFixedSize(true);
                    layoutManager = new LinearLayoutManager(MainActivity.this);
                    recyclerItemAdapter = new RecyclerItemAdapter(addConverterCard);
                    recyclerView.setLayoutManager(layoutManager);
                    recyclerView.setAdapter(recyclerItemAdapter);
                    recyclerItemAdapter.notifyDataSetChanged();
                    closeActionButton();
                }
            }
        });

        ftokConverterLabelBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (clicked) {
                    addConverterCard.add(new RecyclerItem());
                    recyclerView.setHasFixedSize(true);
                    layoutManager = new LinearLayoutManager(MainActivity.this);
                    recyclerItemAdapter = new RecyclerItemAdapter(addConverterCard);
                    recyclerView.setLayoutManager(layoutManager);
                    recyclerItemAdapter.notifyDataSetChanged();
                    closeActionButton();
                }
            }
        });

适配器.Java

public static class RecyclerItemAdapter extends RecyclerView.Adapter<RecyclerItemAdapter.RecyclerViewHolder> {
        

        public ArrayList<RecyclerItem> recyclerItemList;
        public AdapterView.OnItemClickListener recyclerItemListener;
        public List<String> converterType;

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

        public void setOnItemClickListener(OnItemClickListener listener) {
            recyclerItemListener = (AdapterView.OnItemClickListener) listener;
        }

        public static class RecyclerViewHolder extends RecyclerView.ViewHolder {

            EditText inputFahValueET;
            TextView convertResult;
            ImageView tempIconAndConvertBtn;
            ImageView deleteCardBtn;
            String shortResult, longResult;

            public RecyclerViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
                super(itemView);

                inputFahValueET = itemView.findViewById(R.id.input_fahrenheit_value_to_convert);
                convertResult = itemView.findViewById(R.id.output_result_ftc);
                tempIconAndConvertBtn = itemView.findViewById(R.id.temp_icon_convert_btn);
                deleteCardBtn = itemView.findViewById(R.id.remove_card);

                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if (listener != null) {
                            int position = getAdapterPosition();
                            if (position != RecyclerView.NO_POSITION) {
                                listener.onItemClick(position);
                            }
                        }
                    }
                });
            }

        }

        public static class RecyclerViewHolder2 extends RecyclerViewHolder {

            EditText inputFahValueET;
            TextView convertResult;
            ImageView tempIconAndConvertBtn;
            ImageView deleteCardBtn;
            String shortResult, longResult;

            public RecyclerViewHolder2(@NonNull View itemView, final OnItemClickListener listener2) {
                super(itemView, listener2);

                inputFahValueET = itemView.findViewById(R.id.input_fahrenheit_value_to_convert2);
                convertResult = itemView.findViewById(R.id.output_result_ftk);
                tempIconAndConvertBtn = itemView.findViewById(R.id.temp_icon_convert_btn2);
                deleteCardBtn = itemView.findViewById(R.id.remove_card2);

                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if (listener2 != null) {
                            int position = getAdapterPosition();
                            if (position != RecyclerView.NO_POSITION) {
                                listener2.onItemClick(position);
                            }
                        }
                    }
                });
            }

        }

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

        public RecyclerItemAdapter(ArrayList<RecyclerItem> rList) {
            recyclerItemList = rList;
        }

        @NonNull
        @Override
        public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            switch (viewType) {
                case 0:
                View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fahrenheit_to_celsius_converter_layout, parent, false);
                RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(v, (OnItemClickListener) recyclerItemListener);
                return recyclerViewHolder;

                case 2:
                    View v2 = LayoutInflater.from(parent.getContext()).inflate(R.layout.fahrenheit_to_kelvin_converter_layout, parent, false);
                    RecyclerViewHolder2 recyclerViewHolder2 = new RecyclerViewHolder2(v2, (OnItemClickListener) recyclerItemListener);
                    return recyclerViewHolder2;
            }
            return null;
        }

        @Override
        public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position) {
            switch (holder.getItemViewType()) {
                case 0: RecyclerViewHolder viewHolder = (RecyclerViewHolder) holder;
                RecyclerItem currentItem = recyclerItemList.get(position);
                final String[] result = new String[1];

                viewHolder.tempIconAndConvertBtn.setOnClickListener(new View.OnClickListener() {...}

                viewHolder.deleteCardBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        removeCard(viewHolder.getLayoutPosition());
                    }
                });

                break;

                case 2: RecyclerViewHolder2 viewHolder2 = (RecyclerViewHolder2)holder;
                    RecyclerItem currentItem2 = recyclerItemList.get(position);
                    final String[] result2 = new String[1];

                    viewHolder2.tempIconAndConvertBtn.setOnClickListener(new View.OnClickListener() {...}

                    viewHolder2.deleteCardBtn.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            removeCard(viewHolder2.getLayoutPosition());
                        }
                    });

                    break;

            }

        }

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

        public void removeCard(int position) {
            recyclerItemList.remove(position);
            notifyItemRemoved(position);
        }

    }

    public class RecyclerItem {

        public RecyclerItem() {

        }

    }

感谢您的帮助!

完整的适配器类

    public static class RecyclerItemAdapter extends RecyclerView.Adapter<RecyclerItemAdapter.RecyclerViewHolder> {


        public ArrayList<RecyclerItem> recyclerItemList;
        public AdapterView.OnItemClickListener recyclerItemListener;
        public List<String> converterType;

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

        public void setOnItemClickListener(OnItemClickListener listener) {
            recyclerItemListener = (AdapterView.OnItemClickListener) listener;
        }

        public static class RecyclerViewHolder extends RecyclerView.ViewHolder {

            EditText inputFahValueET;
            TextView convertResult;
            ImageView tempIconAndConvertBtn;
            ImageView deleteCardBtn;
            String shortResult, longResult;

            public RecyclerViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
                super(itemView);

                inputFahValueET = itemView.findViewById(R.id.input_fahrenheit_value_to_convert);
                convertResult = itemView.findViewById(R.id.output_result_ftc);
                tempIconAndConvertBtn = itemView.findViewById(R.id.temp_icon_convert_btn);
                deleteCardBtn = itemView.findViewById(R.id.remove_card);

                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if (listener != null) {
                            int position = getAdapterPosition();
                            if (position != RecyclerView.NO_POSITION) {
                                listener.onItemClick(position);
                            }
                        }
                    }
                });
            }

        }

        public static class RecyclerViewHolder2 extends RecyclerViewHolder {

            EditText inputFahValueET;
            TextView convertResult;
            ImageView tempIconAndConvertBtn;
            ImageView deleteCardBtn;
            String shortResult, longResult;

            public RecyclerViewHolder2(@NonNull View itemView, final OnItemClickListener listener2) {
                super(itemView, listener2);

                inputFahValueET = itemView.findViewById(R.id.input_fahrenheit_value_to_convert2);
                convertResult = itemView.findViewById(R.id.output_result_ftk);
                tempIconAndConvertBtn = itemView.findViewById(R.id.temp_icon_convert_btn2);
                deleteCardBtn = itemView.findViewById(R.id.remove_card2);

                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if (listener2 != null) {
                            int position = getAdapterPosition();
                            if (position != RecyclerView.NO_POSITION) {
                                listener2.onItemClick(position);
                            }
                        }
                    }
                });
            }

        }

        @Override
        public int getItemViewType(int position) {
            return recyclerItemList.get(position).getType;
        }

        public RecyclerItemAdapter(ArrayList<RecyclerItem> rList) {
            recyclerItemList = rList;
        }

        @NonNull
        @Override
        public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            switch (viewType) {
                case 0:
                View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fahrenheit_to_celsius_converter_layout, parent, false);
                RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(v, (OnItemClickListener) recyclerItemListener);
                return recyclerViewHolder;

                case 1:
                    View v2 = LayoutInflater.from(parent.getContext()).inflate(R.layout.fahrenheit_to_kelvin_converter_layout, parent, false);
                    RecyclerViewHolder2 recyclerViewHolder2 = new RecyclerViewHolder2(v2, (OnItemClickListener) recyclerItemListener);
                    return recyclerViewHolder2;
            }
            return null;
        }

        @Override
        public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position) {
            switch (holder.getItemViewType()) {
                case 0: RecyclerViewHolder viewHolder = (RecyclerViewHolder) holder;
                RecyclerItem currentItem = recyclerItemList.get(position);
                final String[] result = new String[1];

                viewHolder.tempIconAndConvertBtn.setOnClickListener(new View.OnClickListener() {
                    @SuppressLint("SetTextI18n")
                    @Override
                    public void onClick(View view) {
                        String getIputFahValue = viewHolder.inputFahValueET.getText().toString();
                        NumberFormat nf = new DecimalFormat("0.000");
                        if (!getIputFahValue.isEmpty()) {
                            double d = Double.parseDouble(getIputFahValue);
                            double dd = d - 32;
                            double ddd = dd * 5;
                            double dddd = ddd / 9;
                            result[0] = Double.toString(dddd);

                            viewHolder.convertResult.setText(nf.format(dddd) + "°C");
                            viewHolder.convertResult.setVisibility(View.VISIBLE);
                            viewHolder.shortResult = nf.format(dddd) + "°C";
                            viewHolder.longResult = getIputFahValue + "°F is " + nf.format(dddd) + "°C";

                            if (result[0].contains(".0")) {
                                result[0] = result[0].replace(".0", "");
                                viewHolder.convertResult.setText(result[0] + "°C");
                                viewHolder.convertResult.setVisibility(View.VISIBLE);
                                viewHolder.shortResult = result[0] + "°C";
                                viewHolder.longResult = getIputFahValue + "°F is " + result[0] + "°C";
                            } else if (result[0].contains(".000")) {
                                result[0] = result[0].replace(".000", "");
                                viewHolder.convertResult.setText(result[0] + "°C");
                                viewHolder.convertResult.setVisibility(View.VISIBLE);
                                viewHolder.shortResult = result[0] + "°C";
                                viewHolder.longResult = getIputFahValue + "°F is " + result[0] + "°C";
                            }

                        } else {
                            Toast.makeText(view.getContext(), "Fahrenheit Value Field Cannot Be Blank!", Toast.LENGTH_LONG).show();
                        }
                    }
                });

                viewHolder.convertResult.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View view) {
                        AlertDialog.Builder adb = new AlertDialog.Builder(view.getContext());
                        adb.setIcon(R.drawable.ic_baseline_file_copy_32);
                        adb.setTitle("Copy Result");
                        adb.setMessage("You can copy the result to your clipboard if you would like. Choose if you want the short or long result copied to your clipboard.\n\nExample of Short and Long Result:\nShort Result: 32°C\nLong Result: 0°F is 32°C");

                        adb.setPositiveButton("Short", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                ClipboardManager cbm = (ClipboardManager) view.getContext().getSystemService(CLIPBOARD_SERVICE);
                                ClipData clip = ClipData.newPlainText("Copy", holder.shortResult);
                                cbm.setPrimaryClip(clip);
                                Toast.makeText(view.getContext(), "Result Copied!", Toast.LENGTH_SHORT).show();
                            }
                        });

                        adb.setNegativeButton("Long", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                ClipboardManager cbm = (ClipboardManager) view.getContext().getSystemService(CLIPBOARD_SERVICE);
                                ClipData clip = ClipData.newPlainText("Copy", holder.longResult);
                                cbm.setPrimaryClip(clip);
                                Toast.makeText(view.getContext(), "Result Copied!", Toast.LENGTH_SHORT).show();
                            }
                        });

                        adb.setNeutralButton("Cancel", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                            }
                        });

                        adb.create();
                        adb.show();

                        return false;
                    }
                });

                viewHolder.deleteCardBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        removeCard(viewHolder.ge);
                    }
                });

                break;

                case 2: RecyclerViewHolder2 viewHolder2 = (RecyclerViewHolder2)holder;
                    RecyclerItem currentItem2 = recyclerItemList.get(position);
                    final String[] result2 = new String[1];

                    viewHolder2.tempIconAndConvertBtn.setOnClickListener(new View.OnClickListener() {
                        @SuppressLint("SetTextI18n")
                        @Override
                        public void onClick(View view) {
                            String getIputFahValue = viewHolder2.inputFahValueET.getText().toString();
                            NumberFormat nf = new DecimalFormat("0.000");
                            if (!getIputFahValue.isEmpty()) {
                                double d = Double.parseDouble(getIputFahValue);
                                double dd = d - 32;
                                double ddd = dd * 5;
                                double dddd = ddd / 9;
                                double ddddd = dddd + 273.15;
                                result2[0] = Double.toString(ddddd);

                                viewHolder2.convertResult.setText(nf.format(ddddd) + "°K");
                                viewHolder2.convertResult.setVisibility(View.VISIBLE);
                                viewHolder2.shortResult = nf.format(dddd) + "°K";
                                viewHolder2.longResult = getIputFahValue + "°F is " + nf.format(dddd) + "°K";

                                if (result2[0].contains(".0")) {
                                    result2[0] = result2[0].replace(".0", "");
                                    viewHolder2.convertResult.setText(result2[0] + "°K");
                                    viewHolder2.convertResult.setVisibility(View.VISIBLE);
                                    viewHolder2.shortResult = result2[0] + "°K";
                                    viewHolder2.longResult = getIputFahValue + "°F is " + result2[0] + "°K";
                                } else if (result2[0].contains(".000")) {
                                    result2[0] = result2[0].replace(".000", "");
                                    viewHolder2.convertResult.setText(result2[0] + "°K");
                                    viewHolder2.convertResult.setVisibility(View.VISIBLE);
                                    viewHolder2.shortResult = result2[0] + "°K";
                                    viewHolder2.longResult = getIputFahValue + "°F is " + result2[0] + "°K";
                                }

                            } else {
                                Toast.makeText(view.getContext(), "Fahrenheit Value Field Cannot Be Blank!", Toast.LENGTH_LONG).show();
                            }
                        }
                    });

                    viewHolder2.convertResult.setOnLongClickListener(new View.OnLongClickListener() {
                        @Override
                        public boolean onLongClick(View view) {
                            AlertDialog.Builder adb = new AlertDialog.Builder(view.getContext());
                            adb.setIcon(R.drawable.ic_baseline_file_copy_32);
                            adb.setTitle("Copy Result");
                            adb.setMessage("You can copy the result to your clipboard if you would like. Choose if you want the short or long result copied to your clipboard.\n\nExample of Short and Long Result:\nShort Result: 283.15°K\nLong Result: 50°F is 283.15°K");

                            adb.setPositiveButton("Short", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    ClipboardManager cbm = (ClipboardManager) view.getContext().getSystemService(CLIPBOARD_SERVICE);
                                    ClipData clip = ClipData.newPlainText("Copy", holder.shortResult);
                                    cbm.setPrimaryClip(clip);
                                    Toast.makeText(view.getContext(), "Result Copied!", Toast.LENGTH_SHORT).show();
                                }
                            });

                            adb.setNegativeButton("Long", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    ClipboardManager cbm = (ClipboardManager) view.getContext().getSystemService(CLIPBOARD_SERVICE);
                                    ClipData clip = ClipData.newPlainText("Copy", holder.longResult);
                                    cbm.setPrimaryClip(clip);
                                    Toast.makeText(view.getContext(), "Result Copied!", Toast.LENGTH_SHORT).show();
                                }
                            });

                            adb.setNeutralButton("Cancel", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                }
                            });

                            adb.create();
                            adb.show();

                            return false;
                        }
                    });

                    viewHolder2.deleteCardBtn.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            removeCard(viewHolder2.getLayoutPosition());
                        }
                    });

                    break;

            }

        }

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

        public void removeCard(int position) {
            recyclerItemList.remove(position);
            notifyItemRemoved(position);
        }

    }

    public static class RecyclerItem {
        public int getType;
        int type;

        public RecyclerItem(int mType) {
            this.getType = mType;
        }

        public int getType() {
            return type();
        }

        private int type() {
            return type;
        }
    }

}

【问题讨论】:

  • 查看您的代码 - 您正在创建一个新的适配器,每次单击按钮时都有一个元素。这意味着 RecyclerView 将始终只有一个元素。第一个元素将始终是 RecyclerViewHolder 类型,因为它的位置是 0。

标签: java android android-recyclerview


【解决方案1】:

嗯,我怀疑有些错误,所以我会尝试提出一些建议,也许它可以修复你的代码行为。

  • 在移除卡时,请考虑使用holder.getAbsoluteAdapterPosition() 而不是viewHolder.getLayoutPosition()getAdapterPosition

  • 在添加任何卡时,停止一遍又一遍地创建新的适配器和布局管理器,这个组件应该为任何 RecylcerView 创建一次,只保留对第一个旧创建的适配器的引用作为全局变量,添加新卡对于旧适配器引用的数据 ArrayList,在您作为全局变量保留的旧适配器引用上使用 adapter.notifyDataSetChanged()

  • 我不知道 viewType 算法是如何工作的,但是如果添加按钮的选项决定了您想要哪个,请在 RecyclerItem 对象本身和 @ 中存储您想要的卡片的索引987654325@,您正在覆盖获取所需位置的项目并返回其存储类型,而不是这种奇怪的位置计算 (位置%2*2)。
    通过这样做,根据您将存储在ftoc/ftok/...etcConverterLabelBtn.setOnClickListener 中的整数值进行切换。
    这将是一个解决方案,它不会根据您的添加/删除选择添加或删除正确类型的卡片,因为您的 viewType 算法将根据位置而不是您的选择返回值。

  • 任何时候我使用setHasFixedSize(true)都会给我带来麻烦,所以如果你没有充分的理由使用它,我建议你完全删除/评论它的代码行


更新

您的代码应如下所示:

主要活动

public class MainActivity extends AppCompatActivity {

    ArrayList<RecyclerItem> addConverterCard ;

    private RecyclerView recyclerView;
    private RecyclerItemAdapter recyclerItemAdapter;
    private RecyclerView.LayoutManager layoutManager;

    public TextView ftocConverterLabelBtn, ftokConverterLabelBtn;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recycler_item_view);
        ftocConverterLabelBtn = findViewById(R.id.add_f_to_c_converter_label_btn);
        ftokConverterLabelBtn = findViewById(R.id.add_f_to_k_converter_label_btn);
addConverterCard = new ArrayList<>();
recyclerItemAdapter = new RecyclerItemAdapter(addConverterCard);
layoutManager = new LinearLayoutManager(MainActivity.this);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(recyclerItemAdapter);
ftocConverterLabelBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                if (clicked) {
                    addConverterCard.add(new RecyclerItem(0));
                    recyclerItemAdapter.notifyDataSetChanged();
                    closeActionButton();
                }
            }
        });

        ftokConverterLabelBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (clicked) {
                    addConverterCard.add(new RecyclerItem(1));
                    recyclerItemAdapter.notifyDataSetChanged();
                    closeActionButton();
                }
            }
        });

适配器代码

public static class RecyclerItemAdapter extends RecyclerView.Adapter<RecyclerItemAdapter.RecyclerViewHolder> {
        

        public ArrayList<RecyclerItem> recyclerItemList;
        public AdapterView.OnItemClickListener recyclerItemListener;
        public List<String> converterType;

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

        public void setOnItemClickListener(OnItemClickListener listener) {
            recyclerItemListener = (AdapterView.OnItemClickListener) listener;
        }

        public static class RecyclerViewHolder extends RecyclerView.ViewHolder {

            EditText inputFahValueET;
            TextView convertResult;
            ImageView tempIconAndConvertBtn;
            ImageView deleteCardBtn;
            String shortResult, longResult;

            public RecyclerViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
                super(itemView);

                inputFahValueET = itemView.findViewById(R.id.input_fahrenheit_value_to_convert);
                convertResult = itemView.findViewById(R.id.output_result_ftc);
                tempIconAndConvertBtn = itemView.findViewById(R.id.temp_icon_convert_btn);
                deleteCardBtn = itemView.findViewById(R.id.remove_card);

                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if (listener != null) {
                            int position = getAbsoluteAdapterPosition();
                            if (position != RecyclerView.NO_POSITION) {
                                listener.onItemClick(position);
                            }
                        }
                    }
                });
            }

        }

        public static class RecyclerViewHolder2 extends RecyclerViewHolder {

            EditText inputFahValueET;
            TextView convertResult;
            ImageView tempIconAndConvertBtn;
            ImageView deleteCardBtn;
            String shortResult, longResult;

            public RecyclerViewHolder2(@NonNull View itemView, final OnItemClickListener listener2) {
                super(itemView, listener2);

                inputFahValueET = itemView.findViewById(R.id.input_fahrenheit_value_to_convert2);
                convertResult = itemView.findViewById(R.id.output_result_ftk);
                tempIconAndConvertBtn = itemView.findViewById(R.id.temp_icon_convert_btn2);
                deleteCardBtn = itemView.findViewById(R.id.remove_card2);

                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if (listener2 != null) {
                            int position = getAbsoluteAdapterPosition();
                            if (position != RecyclerView.NO_POSITION) {
                                listener2.onItemClick(position);
                            }
                        }
                    }
                });
            }

        }

        @Override
        public int getItemViewType(int position) {
            return recyclerItemList.get(position).getType();
        }

        public RecyclerItemAdapter(ArrayList<RecyclerItem> rList) {
            recyclerItemList = rList;
        }

        @NonNull
        @Override
        public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            switch (viewType) {
                case 0:
                View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fahrenheit_to_celsius_converter_layout, parent, false);
                RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(v, (OnItemClickListener) recyclerItemListener);
                return recyclerViewHolder;

                case 1:
                    View v2 = LayoutInflater.from(parent.getContext()).inflate(R.layout.fahrenheit_to_kelvin_converter_layout, parent, false);
                    RecyclerViewHolder2 recyclerViewHolder2 = new RecyclerViewHolder2(v2, (OnItemClickListener) recyclerItemListener);
                    return recyclerViewHolder2;
            }
            return null;
        }

        @Override
        public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position) {
            switch (holder.getItemViewType()) {
                case 0: RecyclerViewHolder viewHolder = (RecyclerViewHolder) holder;
                RecyclerItem currentItem = recyclerItemList.get(position);
                final String[] result = new String[1];

                viewHolder.tempIconAndConvertBtn.setOnClickListener(new View.OnClickListener() {...});

                viewHolder.deleteCardBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        removeCard(holder.getAbsoluteAdapterPosition());
                    }
                });

                break;

                case 1: RecyclerViewHolder2 viewHolder2 = (RecyclerViewHolder2)holder;
                    RecyclerItem currentItem2 = recyclerItemList.get(position);
                    final String[] result2 = new String[1];

                    viewHolder2.tempIconAndConvertBtn.setOnClickListener(new View.OnClickListener() {...});

                    viewHolder2.deleteCardBtn.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            removeCard(holder.getAbsoluteAdapterPosition());
                        }
                    });

                    break;

            }

        }

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

        public void removeCard(int position) {
            recyclerItemList.remove(position);
            notifyItemRemoved(position);
        }

    public class RecyclerItem {
        int type ;
        public RecyclerItem(int m_type) {
        this.type = m_type ;
        }
        public int getType(){
            return type;
        }

    }
}

【讨论】:

  • 非常感谢!我不得不在适配器类底部的公共类 RecyclerItem 中添加一些东西,因为我在类型下得到了一条红线。返回类型。它希望我添加一些东西。 public int getType 以上(int type),和private int type(){return type};添加这些之后,红线消失了,它正在添加我想要的卡片。但是,在删除卡片时,当我开始输入 removeCard(holder.) 时菜单中不存在 getAbsoluteAdapterPosition,此处出现的列表并未列出它。我想知道为什么?
  • 对 getType 事件很抱歉,因为我并没有真正将代码放在真正的类中,而是立即就在这里,我的坏事但好事你已经成功了。关于持有人没有方法的问题,只需给我几分钟/时间,我会尝试找出问题所在并回复您:\
  • 如果我像这样输入 removeCard(holder.getAbsoluteAdapterPosition); getAbsoluteAdaptetPosition 变成红色,就像它不知道它是什么一样。菜单中的选项有:getLayoutPosition()、getAdapterPosition()、getOldPosition()、getPosition()(已弃用)、getItemViewType()、getItemId() 和 getClass()
  • 我检查了 build.gradle 并没有 recyclerview 依赖项。这是一个疏忽。无论如何,我添加了它,同步了它,现在我终于有了 getAbsoluteAdapterPosition!我将其更改为那个,现在它可以正确删除。现在一切正常。再次感谢您的所有帮助!我真的很感激!
  • 没问题,祝您顺利完成您的应用程序。
猜你喜欢
  • 2018-09-18
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 2019-04-04
  • 1970-01-01
相关资源
最近更新 更多