Android:如何使用 RecyclerView 实现图片库
Posted
技术标签:
【中文标题】Android:如何使用 RecyclerView 实现图片库【英文标题】:Android: How to implement a image gallery with RecyclerView 【发布时间】:2016-04-01 05:03:25 【问题描述】:我想创建一个图片库,其中TextView
作为标题,ImageViews
在HorizontalScrollView
中,就像它显示在这个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.
但这会导致应用程序崩溃。
【问题讨论】:
是否要在可绘制对象为空时显示默认图像? 这是有可能的。但是不,我不想显示默认图像,因为 HorizontalScrollView 应该在每个 raw 的最后一个图像之后停止。 【参考方案1】:我想在一个稍微类似的问题中参考我自己的答案:https://***.com/a/34462696/1658267(注意!接下来,我将使用从那里命名的类/方法)
唯一的区别是将TextViews
替换为ImageView
s。像这样:
<?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