【问题标题】:How to make one view bigger than the other views in RecyclerView?如何使一个视图大于 RecyclerView 中的其他视图?
【发布时间】:2017-08-21 03:32:36
【问题描述】:

我的 json API 中的图像很少,我设法使用 volley Library 获取这些图像。我将 recyclerview 与图像适配器一起使用以在两列中垂直显示图像视图,但我想让一个图像变大并将其显示为用户可以单击的第一个图像。此外,每个时间间隔都会更改该图像。基本上,API 将完成所有的后端任务,例如设置时间并告诉回收器视图顶部显示哪个图像,如果不是所有图像都必须具有相同的大小并垂直显示在 2 列中。

我有 recyclerview 的方形布局类。我只是想知道我该怎么做。即使是概念也可以。

【问题讨论】:

  • 您可以使用FlexboxLayout 代替 RecyclerView 以便于实施。
  • @HusseinElFeky 能否请您推荐我可以为 android 学习 flexbox 的不错且有效的资源。谢谢您的回复
  • 你能告诉我如何在不使用 flexboxLayout 的情况下实现我想要的东西,这样我就可以说哪个容易了

标签: java android android-layout android-recyclerview


【解决方案1】:

您必须为小项目创建两个视图,另一个为标题项目创建两个视图,并且在onBindViewHolder 中必须相应地绑定它们,以下代码是新闻文章应用程序的示例,应该会有所帮助。

public class AdapterNewsArticlesListWithHeader extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private List<NewsArticles> items = new ArrayList<>();

    private Context ctx;
    private NewsArticles header;
    private static final int TYPE_HEADER = 0;
    private static final int TYPE_ITEM = 1;
    private OnItemClickListener mOnItemClickListener;

    public interface OnItemClickListener {
    void onItemClick(View view, NewsArticles obj, int position);
    }

    public void setOnItemClickListener(final OnItemClickListener mItemClickListener) {
    this.mOnItemClickListener = mItemClickListener;
    }

    // Provide a suitable constructor (depends on the kind of dataset)
    public AdapterNewsArticlesListWithHeader(Context context, NewsArticles header, List<NewsArticles> items) {
    this.items = items;
    this.header = header;
    ctx = context;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
    // each data item is just a string in this case
    public TextView title;
    public TextView short_content;
    public TextView date;
    public ImageView image;
    public LinearLayout lyt_parent;

    public ViewHolder(View v) {
        super(v);
        title = (TextView) v.findViewById(R.id.title);
        short_content = (TextView) v.findViewById(R.id.short_content);
        date = (TextView) v.findViewById(R.id.date);
        image = (ImageView) v.findViewById(R.id.image);
        lyt_parent = (LinearLayout) v.findViewById(R.id.lyt_parent);
    }
    }

    class ViewHolderHeader extends RecyclerView.ViewHolder {
    public TextView title;
    public TextView date;
    public ImageView image;
    public LinearLayout lyt_parent;

    public ViewHolderHeader(View v) {
        super(v);
        title = (TextView) v.findViewById(R.id.title);
        date = (TextView) v.findViewById(R.id.date);
        image = (ImageView) v.findViewById(R.id.image);
        lyt_parent = (LinearLayout) v.findViewById(R.id.lyt_parent);
    }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == TYPE_HEADER) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_header, parent, false);
        return new ViewHolderHeader(v);
    } else if (viewType == TYPE_ITEM) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_news, parent, false);
        return new ViewHolder(v);
    }
    return null;
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
    if (holder instanceof ViewHolderHeader) {
        ViewHolderHeader vHeader = (ViewHolderHeader) holder;
        vHeader.title.setText(header.getTitle());
        vHeader.date.setText(header.getDate());
        Picasso.with(ctx).load(header.getImage()).into(vHeader.image);
        vHeader.lyt_parent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //TODO: do your thing
            }
        });

    } else if (holder instanceof ViewHolder) {
        final NewsArticles c = items.get(position);
        ViewHolder vItem = (ViewHolder) holder;
        vItem.title.setText(c.getTitle());
        vItem.short_content.setText(c.getShort_content());
        vItem.date.setText(c.getDate());
        Picasso.with(ctx).load(c.getImage()).into(vItem.image);
        vItem.lyt_parent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //TODO: do your thing
            }
        });
    }

    }

    //    need to override this method
    @Override
    public int getItemViewType(int position) {
    if (isPositionHeader(position)) {
        return TYPE_HEADER;
    }
    return TYPE_ITEM;
    }

    private boolean isPositionHeader(int position) {
    return position == 0;
    }

    public NewsArticles getItem(int position) {
    return items.get(position);
    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
    return items.size();
    }

}

【讨论】:

  • 你能分享所有要在回收站上设置的xml代码和布局管理器吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多