【问题标题】:Adding icon in android RecyclerView在android RecyclerView中添加图标
【发布时间】:2016-11-17 12:52:55
【问题描述】:

我有一个 recyclerView 作为扩展列表视图,如下所示:

我想在每个标题的每个第二个子项(动态生成的子项)中添加一个图标。我在图中用红色圆圈提到了这个图标。

这是我的适配器类。

public class ExpandableListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    public static final int HEADER = 0;
    public static final int CHILD = 1;

    private List<Item> data;

    public ExpandableListAdapter(List<Item> data) {
        this.data = data;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type) {
        View view = null;
        Context context = parent.getContext();
        float dp = context.getResources().getDisplayMetrics().density;
        int subItemPaddingLeft = (int) (18 * dp);
        int subItemPaddingTopAndBottom = (int) (5 * dp);
        switch (type) {
            case HEADER:
                LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                view = inflater.inflate(R.layout.list_header, parent, false);
                ListHeaderViewHolder header = new ListHeaderViewHolder(view);
                return header;
            case CHILD:
                TextView itemTextView = new TextView(context);
                itemTextView.setPadding(subItemPaddingLeft, subItemPaddingTopAndBottom, 0, subItemPaddingTopAndBottom);
                itemTextView.setTextColor(0x88000000);
                itemTextView.setLayoutParams(
                        new ViewGroup.LayoutParams(
                                ViewGroup.LayoutParams.MATCH_PARENT,
                                ViewGroup.LayoutParams.WRAP_CONTENT));
                return new RecyclerView.ViewHolder(itemTextView) {
                };
        }
        return null;
    }

    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        final Item item = data.get(position);
        switch (item.type) {
            case HEADER:
                final ListHeaderViewHolder itemController = (ListHeaderViewHolder) holder;
                itemController.refferalItem = item;
                itemController.header_title.setText(item.text);
                if (item.invisibleChildren == null) {
                    itemController.btn_expand_toggle.setImageResource(R.drawable.circle_minus);
                } else {
                    itemController.btn_expand_toggle.setImageResource(R.drawable.circle_plus);
                }
                itemController.btn_expand_toggle.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (item.invisibleChildren == null) {
                            item.invisibleChildren = new ArrayList<Item>();
                            int count = 0;
                            int pos = data.indexOf(itemController.refferalItem);
                            while (data.size() > pos + 1 && data.get(pos + 1).type == CHILD) {
                                item.invisibleChildren.add(data.remove(pos + 1));
                                count++;
                            }
                            notifyItemRangeRemoved(pos + 1, count);
                            itemController.btn_expand_toggle.setImageResource(R.drawable.circle_plus);
                        } else {
                            int pos = data.indexOf(itemController.refferalItem);
                            int index = pos + 1;
                            for (Item i : item.invisibleChildren) {
                                data.add(index, i);
                                index++;
                            }
                            notifyItemRangeInserted(pos + 1, index - pos - 1);
                            itemController.btn_expand_toggle.setImageResource(R.drawable.circle_minus);
                            item.invisibleChildren = null;
                        }
                    }
                });
                break;
            case CHILD:
                TextView itemTextView = (TextView) holder.itemView;
                itemTextView.setText(data.get(position).text);
                break;
        }
    }

    @Override
    public int getItemViewType(int position) {
        return data.get(position).type;
    }

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

    private static class ListHeaderViewHolder extends RecyclerView.ViewHolder {
        public TextView header_title;
        public ImageView btn_expand_toggle;
        public Item refferalItem;

        public ListHeaderViewHolder(View itemView) {
            super(itemView);
            header_title = (TextView) itemView.findViewById(R.id.header_title);
            btn_expand_toggle = (ImageView) itemView.findViewById(R.id.btn_expand_toggle);
        }
    }

    public static class Item {
        public int type;
        public String text;
        public List<Item> invisibleChildren;

        public Item() {
        }

        public Item(int type, String text) {
            this.type = type;
            this.text = text;
        }
    }
}

我无法根据我的要求更改此适配器类。如何更改此适配器类以在每个标题的每个第二个子项中添加图标?

注意:如果需要任何其他信息,请询问。

【问题讨论】:

  • 您已经创建了 child.xml 布局,就像“list_header.xml”一样,然后在 onCreateViewHolder 中使用这个 xml,与 Header 相同。

标签: android android-recyclerview android-arrayadapter expandablelistview expandablelistadapter


【解决方案1】:

如果您想继续动态创建 TextView,可以使用:

itemTextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.your_drawable, 0);

设置图标。

如果你想对布局有更多的控制,我建议使用与 header 类似的方法(使用布局膨胀),例如:

LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

switch (type) {
    case HEADER:
        view = inflater.inflate(R.layout.list_header, parent, false);
        ListHeaderViewHolder header = new ListHeaderViewHolder(view);
        return header;
    case CHILD:
        view = inflater.inflate(R.layout.list_child, parent, false);
        ListChildViewHolder child = new ListChildViewHolder(view);
        return child;
}

要每隔一个孩子显示图标,在您的onBindViewHolder 中添加:

itemController1.yourIcon.setVisibility((position % 2 == 0) ? View.VISIBLE : View.GONE);

【讨论】:

  • 它添加了图标,但是,在所有子列表中..我只想添加图标标题的第二个孩子..这是我更改的代码..
  • 抱歉,我没有注意到这个要求。你可以用 Alex Shutov 在下面写的来解决这个问题:在你的 onBindViewHolder 中,添加 itemController1.yourIcon.setVisibility((position % 2 == 0) ? View.VISIBLE : View.GONE);
  • 请查看问题中更新的第三张图片。第一父母和他们的孩子都可以。但在第二个父母中,图标在第一个孩子的地方。它需要第二个孩子的地方(就像第一个父母一样)。
  • 你能试试:boolean showIcon = position &gt; 2 &amp;&amp; getItemViewType(position) == CHILD &amp;&amp; getItemViewType(position - 2) == HEADER吗?可能有一些边缘情况需要保护,但应该可以工作:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多