Android:如何创建类似Facebook的图像库网格?

3

我正在尝试实现类似Facebook的画廊网格,其中项目具有不同的大小:

enter image description here

我尝试使用不同的库/解决方案,但目前没有成功:
  1. 我尝试使用AsymemetricGridView。 但是这种实现的问题是在适配器中遍历后会留下空的死区。
  2. 我还考虑使用StaggeredGridLayoutManagerRecycleView,但是在这种情况下,项的大小与Facebook画廊中实现的其他项的大小不相等或一半。
现在我正在考虑为适配器中的不同情况提供不同的视图持有者,但我真的不喜欢这个想法。有什么更好的方法来完成这个任务?
2个回答

3
最终,我决定使用TwoWayView库。
你可以从https://github.com/lucasr/twoway-view获取该库。
在我的代码中,我进行了以下主要更改:
将TwoWayView添加到xml布局中:
 <org.lucasr.twowayview.widget.TwoWayView
            android:id="@+id/twvGrid"
            android:background="@android:color/white"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            style="@style/TwoWayView"
            app:twowayview_layoutManager="SpannableGridLayoutManager"
            app:twowayview_numColumns="3"
            app:twowayview_numRows="3" />

我在代码中做出了以下更改:

private TwoWayView mTwvGrid;
.........

 mTwvGrid = (TwoWayView) findViewById(R.id.twvGrid);
    final Drawable divider = getResources().getDrawable(R.drawable.divider);
    mTwvGrid.addItemDecoration(new DividerItemDecoration(divider));


    mTwvGrid.setOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            RequestManager glideRequestManager = Glide.with(TimelineStoryActivity.this);
            if (newState == RecyclerView.SCROLL_STATE_IDLE || newState == RecyclerView.SCROLL_STATE_SETTLING) {
                glideRequestManager.resumeRequests();
            } else {
                glideRequestManager.pauseRequests();
            }
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {}
    });
.......

if (mAdapter == null) {
            mAdapter = new TimelineStoryRecycleAdapter(this, mStory, mTwvGrid, this);
            mTwvGrid.setAdapter(mAdapter);
        } else {
            mAdapter.setStory(mStory);
        }

这是最终结果: 在此输入图像描述

1
@Emil Adz,您能否发布您的TimelineStoryRecycleAdapter代码?此视图需要一个ListAdapter,在当前的Android ListAdapter中是一个接口,因此请帮忙设计和应用适配器。 - Ak9637
@Ak9637,抱歉,我不能做到,因为我不再拥有这个类。 - Emil Adz
好的,如果可能的话,您能否解释一下这个问题:这个视图需要一个ListAdapter,在当前的Android中,ListAdapter是一个接口,所以请帮忙设计和应用适配器。 - Ak9637
twoway-view 的实现比 AsymemetricGridView 简单得多且速度更快。 - Edijae Crusar
这个库现在无法工作。有其他的解决方案吗? - Krutika Chotara

1
您可以使用StaggeredGridLayoutManager与recyclerview来实现此功能。StaggeredGridLAyoutManager已经处理了这个问题,同时您可以使用setFullSpan来使图像占用整行。

如果您查看我的问题中的第2部分,您将会知道我尝试了这个选项,但是网格中项目的高度存在问题。我需要高度相同且为原来大小的两倍。 - Emil Adz
你需要的是图片视图的高度,你可以轻松地给它一个固定的高度来实现这一点,我已经看到了你的第二个要点。 - JAAD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接