17

我需要在 RecyclerView 的项目之间添加一个小条。该条可以出现在列表中不同数量的项目之后。这需要动态完成。我需要实现类似 FitBit 所做的事情:在此处输入图像描述

即使页面向下滚动,我也需要第一行,即说“本周”的那一行。

4

5 回答 5

6

您应该使用getItemViewType(int)来使用不同视图类型的概念。然后在onCreateViewHolder(ViewGroup, int)你可以检查你应该膨胀/创建哪种类型。

例子:

@Override
public int getItemViewType(int position) {
    // you should return the view type, based on your own dynamic logic
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
     switch (viewType) {
         // handle each view type accordingly
     }
}
于 2016-01-13T10:37:19.857 回答
2

使用StickyHeaderRecyclerView 库

这是非常容易使用

于 2016-01-15T09:52:02.647 回答
0

如果你想以“正确”的方式做到这一点,没有黑客,你应该编写自己的 LayoutManager,并手动处理这些情况。这并不像听起来那么难,但需要一些努力。

于 2016-01-15T10:08:57.140 回答
0

有两种方法可以实现RecyclerView

  1. 在每个布局中添加标题并根据您的要求隐藏/显示(首选)。
  2. 或者对标题和内容使用两种不同的布局(不推荐,因为它可能会导致适配器中的项目总数出现问题)。

在您的自定义 POJO / GetterSetter 类中,为headerStatus(布尔值或 int)添加一个字段,以确定是否显示标题。

现在在适配器覆盖public int getItemViewType(int position)中。

static final int TYPE_ITEM = 0;
static final int TYPE_SEPARATOR = 1;
@Override
public int getItemViewType(int position) {
	if (mData.get(position).getHeaderStatus() == 0)
		return TYPE_ITEM;
	else
		return TYPE_SEPARATOR;
}

现在在膨胀布局时,getView()您可以通过以下方式检查行类型

int rowType = getItemViewType(position);

对于案例 1,您需要显示标题并在其中设置适当的数据。对于案例 2,您需要扩展该标题布局并在其中添加适当的数据。

于 2016-01-15T07:21:50.843 回答
0

您可以在 中使用多个视图类型的概念RecyclerView,只需使用getItemViewType(),并注意 中的 viewType 参数onCreateViewHolder()

例如,您可以使用以下模型:

    public class Data{
           int field1;
           float filed2;
           int rowType // 1,2,2,...N this will fill by you whenever you will    
                       //creating arraylist for your recyclerview
     }


    public class Custome Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    ArrayList<Data> mItems;

    class ViewHolderRowType1 extends RecyclerView.ViewHolder {
        ...
    }

    class ViewHolderRowType2 extends RecyclerView.ViewHolder {
        ...
    }

    ....
    class ViewHolderRowTypeN extends RecyclerView.ViewHolder {
        ...
    }

    @Override
    public int getItemViewType(int position) {
        return mItems.get(position).rowType; 
        //or
        //return positon%2; // This will based on your condition        
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         switch (viewType) {
             case 0: return new ViewHolderRowType0(...);
             case 1: return new ViewHolderRowType1(...);
             ...
             case N: return new ViewHolderRowTypeN(...);
         }
    }

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

    //Just check which view type is going to bind and then fill the data accordingly in your rows


      if(vh instanceof ViewHolderRowType1){
       // Fill the data for first view type


      } else if (vh instanceof ViewHolderRowType2) {
       // Fill the data for second view type


      } else if (vh instanceof ViewHolderRowTypeN){
       // Fill the data for Nth view type


      }

    }

对于您的粘性“此视图弱”,您可以将其添加到您的顶部,RecyclerView然后通过 RecyclerView 的滚动事件处理它

于 2016-01-15T05:38:56.033 回答