【问题标题】:RecyclerView GridLayoutManager: change column widthRecyclerView GridLayoutManager:更改列宽
【发布时间】:2016-05-09 14:31:50
【问题描述】:

我有一个 RecyclerView 和一个 GridLayoutManager。 列宽相等,但我想要第一列的宽度为80dp。 这可能吗?

示例:RecyclerView 宽度为 5 列

final columnsCount = 5;

recyclerView.width = 500dp

column0.width = 80dp

column 1-2-3-4 width = (recyclerview.width - column0.width) / columnsCount

有什么建议吗?

编辑:代码

public class TestRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private static final int VIEW_TYPE_START = 0;
    private static final int VIEW_TYPE_PROGRESS_ITEM = 1;
    private LayoutInflater inflater;

    public TestRecyclerViewAdapter(Context context) {
        this.inflater = LayoutInflater.from(context);
    }

    @Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return VIEW_TYPE_START;
        } else {
            return VIEW_TYPE_PROGRESS_ITEM;
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        final View view;
        switch (viewType) {
            case VIEW_TYPE_START:
                view = this.inflater.inflate(R.layout.view_item_small, parent, false);
                return new TestViewHolder(view);
            case VIEW_TYPE_PROGRESS_ITEM:
                view = this.inflater.inflate(R.layout.view_item, parent, false);
                return new TestViewHolder(view);
        }
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    }

    @Override
    public int getItemCount() {
        return 5;
    }
}

view_item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0000FF"
android:orientation="vertical">

view_item_small.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="80dp"
android:layout_height="match_parent"
android:background="#FF0000"
android:orientation="vertical">

用法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
    recyclerView.setAdapter(new TestRecyclerViewAdapter(this));
    recyclerView.setLayoutManager(new GridLayoutManager(this, 5));
}

【问题讨论】:

  • 您找到解决方案了吗?
  • 您的编辑中提供的解决方案(我认为是,可能是错误的)真的有效吗?我在列xml中设置了固定宽度,但没有效果。
  • @Ixx 不,编辑是我的代码展示了我的问题,而不是解决方案。

标签: android android-recyclerview gridlayoutmanager


【解决方案1】:

在您的适配器中,您可以做到这一点。

检查项目的位置是否等于0,如果是,则以80dp宽度膨胀布局。

【讨论】:

  • 虽然这回答了部分问题(“这可能吗?”),但您确实应该解释如何设置列宽或只是发表评论而不是发布答案。
【解决方案2】:

创建第二个宽度为 80dp 的布局以在您的 RecyclerView.Adapter 中使用,然后在 onCreateViewHolder() 方法中检查项目的位置是否等于 0,如果是,则使用 80dp 宽度扩展布局,否则扩展正常布局。 你应该创建自己的 viewTypes 来这样做,你必须重写 getItemViewType(int position) 方法,这看起来像这样:

private static final int VIEWTYPE_FIRST_ITEM = 1;
private static final int VIEWTYPE_NORMAL_ITEM = 2;

@Override
public int getItemViewType(int position) {
    if(position == 0) {
        return VIEWTYPE_FIRST_ITEM;
    } else {
        return VIEWTYPE_NORMAL_ITEM;
    }
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view;
    if(viewType == VIEWTYPE_FIRST_ITEM) {
        view =  //TODO inflate layout with 80dp
    } else {
        view =  //TODO inflate normal layout
    }
    return new ViewHolder(view);
}

【讨论】:

  • 我在 onCreateViewHolder() 中膨胀布局,而不是在 onBindViewHolder() 中
  • 是的,对不起我的错误,应该是 onCreateViewHolder(),我会编辑答案
猜你喜欢
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
相关资源
最近更新 更多