如何将多个 CardView 布局添加到 RecyclerView? [英] How Do I Add Multiple CardView Layouts To A RecyclerView?

查看:41
本文介绍了如何将多个 CardView 布局添加到 RecyclerView?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Here is a video of the behavior of the app that I am trying to explain just in case if you didn't understand my explanation of the problem. See the link below...

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

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

I am trying to develop an android app that has several card view layouts that will be displayed in one recycler view. I am not having much luck getting the recycler view to list the layouts like I want it to. I can add the first layout just fine, and then add the second layout just as long as the first card view layout exists in the recycler view. If it doesn't exists in the recycler view, and I try adding the second card view layout first by clicking on the button to add it a couple times, it will add it along with the first card view layout. Also, when trying to remove the card views from the layout they are not removing correctly. Here is what I have in my java code...

MainActivity.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;
        }
    }

}

推荐答案

好吧,我怀疑有一些错误,所以我会尝试并提出一些建议,也许它可以修复您的代码行为.

well there's some mistakes I suspect so I will try and suggest some things maybe it fixes your code behavior.

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

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

on adding any card, stop creating a new Adapter and LayoutManager over and over again, this components should be created once for any RecylcerView, just keep a reference to only the first old created adapter as a global variable, add the new card to the data ArrayList that the old adapter has reference to, use adapter.notifyDataSetChanged() on the old adapter reference that you're keeping as global variable.

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

I don't know how the viewType algorithm works, but if the options from add button decide which one you want, store an index to which card you want in the RecyclerItem object itself and in getItemViewType that you're overriding get the item at the required position and return its stored type rather than this strange position calculation (position%2*2).
by doing that make switch cases according to the integer values that you will be storing in ftoc/ftok/...etcConverterLabelBtn.setOnClickListener.
that would be a solution that it doesn't add or delete the right type of card in correspondence to your add/delete choices since your viewType algorithm will return value based on just the position not your choice.

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

anytime I used setHasFixedSize(true) it caused me trouble, so if you don't have a good reason to be using this, I suggest that you delete/comment its line of code completely

你的代码应该是这样的:

your code should be looking like this :

主要活动

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;
        }

    }
}

这篇关于如何将多个 CardView 布局添加到 RecyclerView?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆