RecyclerView GridLayoutManager: изменить ширину столбца

У меня есть 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));
}

2 ответа

В вашем адаптере вы можете сделать это.

проверьте, равняется ли позиция элемента 0, если это так, то увеличьте разметку шириной 80dp.

Создайте второй макет с шириной 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);
}
Другие вопросы по тегам