Recycler视图在水平滚动的网格中排列项目

时间:2018-03-29 16:18:44

标签: android android-recyclerview gridlayoutmanager

我需要在排列在网格中的RecyclerView中显示一组图标,并使该网格水平滚动。通常我会使用GridLayoutManager这样的东西,但我的要求阻止我这样做。也就是说,不仅需要将项目排列在网格中,而且还需要逐行添加到网格中而不是逐列添加(这是GridLayoutManager这样做的方式)。因此,例如,如果网格是3x3并且我有4个项目,则它们不应该采用位置1,4,7和2.但是位置1,2,3和4。

RecyclerView的任何替代品都可以让我做这项工作。

1 个答案:

答案 0 :(得分:1)

您可以考虑为每一行使用HorizontalScrollView。我给你一个示例实现。

您需要首先将项目的布局放在每一行中。让我们有如下布局。

让我们有这样的布局。我们将其命名为item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some title" />
</LinearLayout>

现在让我们有一个View类来动态加载这个布局。

public class CustomItemView extends LinearLayout {
    private Context context;
    private TextView mTextView;

    public CustomItemView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initView(context);
    }

    public CustomItemView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }

    public CustomItemView(Context context) {
        super(context);
        initView(context);
    }

    private void initView(Context context) {
        this.context = context;

        View v = inflate(context, R.layout.item_layout, null);
        mTextView = (TextView) v.findViewById(R.id.title);

        addView(v);
    }

    public void setTitle(String title) {
        mTextView.setText(title);
    }
}

现在让我们有一个类来填充HorizontalScrollView中的视图。

public class MyHorizontalScrollView {
    HorizontalScrollView horizontalScrollView;
    LinearLayout linearLayout;
    Context context;

    public MyHorizontalScrollView(final Context context) {
        this.context = context;
        initScrollView();
    }

    private void initScrollView() {
        horizontalScrollView = new HorizontalScrollView(context);
        HorizontalScrollView.LayoutParams params = new HorizontalScrollView.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        horizontalScrollView.setLayoutParams(params);
        horizontalScrollView.setHorizontalScrollBarEnabled(false);

        linearLayout = new LinearLayout(context);
        LinearLayout.LayoutParams linearLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        linearLayout.setLayoutParams(linearLayoutParams);

        horizontalScrollView.addView(linearLayout);
    }

    public LinearLayout addHorizontalScrollView(LinearLayout linearLayout) {
        linearLayout.addView(horizontalScrollView);
        return linearLayout;
    }

    public CustomItemView addNewEntryView(final String newTitle) {
        CustomItemView customItemView = new CustomItemView(context);
        customItemView.setTitle(newTitle);
        linearLayout.addView(customItemView);

        return customItemView;
    }
}

现在获得一个LinearLayout作为滚动视图持有者,并根据要添加到每行中的项目添加视图。

Activity

的活动布局中
<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:fillViewport="true">

    <LinearLayout
        android:id="@+id/scrollViewHolder"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" />
</ScrollView>

现在只需将您的HorizontalRecyclerView添加到此LinearLayout,然后循环浏览您的列表,一次三次。

private LinearLayout mScrollViewHolder;
mScrollViewHolder = (LinearLayout) v.findViewById(R.id.scrollViewHolder);

MyHorizontalScrollView myHorizontalScrollView = new MyHorizontalScrollView(this.getContext());
myHorizontalScrollView.addHorizontalScrollView(mScrollViewHolder);
myHorizontalScrollView.addNewEntryView("Something");