Android:如何使用 RecyclerView 实现图片库

Posted

技术标签:

【中文标题】Android:如何使用 RecyclerView 实现图片库【英文标题】:Android: How to implement a image gallery with RecyclerView 【发布时间】:2016-04-01 05:03:25 【问题描述】:

我想创建一个图片库,其中TextView 作为标题,ImageViewsHorizontalScrollView 中,就像它显示在这个figure 中一样。

我使用RecyclerView来减少我的应用程序的资源并使用许多ArrayList 来实现图像:

        itemFotoIDs.addAll(Arrays.asList(
                R.drawable.cable_crunches_1
                ,R.drawable.dips_1
                ,R.drawable.kabelrudern_breit_1
                ,R.drawable.kabelrudern_eng_1
                ,R.drawable.klimmzug_1
                ,R.drawable.kh_schulterdruecken_1
                ,R.drawable.kh_curls_1
                ,R.drawable.lh_bankdruecken_1
                ,R.drawable.lh_bankdruecken_eng_1
                ,R.drawable.lh_kniebeuge_1
                ,R.drawable.lh_kreuzheben_1
                ,R.drawable.lh_schraegbankdruecken_1
                ,R.drawable.latzug_obergriff_1
                ,R.drawable.seitheben_1
                ,R.drawable.szhantel_curls_1
        ));

现在我的问题是:ArrayList 的一行中创建一个空条目的最佳解决方案是什么,例如我有五个 ArrayList 有 15 个条目,两个只有 14 或 13 个条目。但我希望在确切的行而不是最后的空条目。 我尝试实现 null 而不是 R.drawable. 但这会导致应用程序崩溃。

【问题讨论】:

是否要在可绘制对象为空时显示默认图像? 这是有可能的。但是不,我不想显示默认图像,因为 Horizo​​ntalScrollView 应该在每个 raw 的最后一个图像之后停止。 【参考方案1】:

我想在一个稍微类似的问题中参考我自己的答案:https://***.com/a/34462696/1658267(注意!接下来,我将使用从那里命名的类/方法)

唯一的区别是将TextViews 替换为ImageViews。像这样:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="@drawable/rounded_background"
    android:layout_margin="4dp"
    android:layout_
    android:layout_>
    <ImageView
        android:id="@+id/chipImageView"
        android:layout_
        android:layout_ />
</FrameLayout>

关于空位 - 有多种选择:

您可以传递空值,然后在称为ChipView(在您的情况下 - 用图像查看)的东西中,在displayItem() 方法中检查参数是否为空 - 然后只需为View 设置适当的宽度

您可以为水平RecyclerView 创建单独的viewType 并为其创建一个空视图(作为占位符)。那你需要稍微更新一下ChipsAdapter

static int IMAGE_VIEW_TYPE = 1;
static int EMPTY_SLOP_TYPE = 2;

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
    if (viewType = IMAGE_VIEW_TYPE) 
        return new ChipViewHolder(new ChipView(parent.getContext()));
     else 
        return new ChipViewHolder(new EmptyView(parent.getContext()));
    


@Override
public int getItemViewType(int position) 
    return chipsArray[position] == null? EMPTY_SLOP_TYPE : IMAGE_VIEW_TYPE;


@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) 
    if (holder.itemView instanceof ChipView) 
        ((ChipView) holder.itemView).displayItem(chipsArray[position]);
    

并创建一个EmptyView,具有预定义的非 0 宽度。

我个人更喜欢第二种选择(解耦,更易于维护 onClick - 没有额外的逻辑等)

希望对你有帮助。

【讨论】:

以上是关于Android:如何使用 RecyclerView 实现图片库的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 RecyclerView 使用 Android 视图绑定

如何使用 LiveData 正确更新 Android 的 RecyclerView?

我们如何在 android 的 RecyclerView 片段中使用 bottomSheet?

如何在android中使用OkHttp从web api获取json数据到RecyclerView

如何导入 RecyclerView for Android L-preview

如何在 android studio 中使用 recyclerview 或列表视图创建相同的东西?