【问题标题】:Multiple Headers in recycleview not working - why so?recyclerview 中的多个标题不起作用 - 为什么会这样?
【发布时间】:2019-10-31 05:44:39
【问题描述】:

我想创建带有多个标头的 recycleview,第一个标头工作得很好,但其余的标头没有按预期工作。这是我第一次使用 recycleview headers 。我也想知道这是正确的做法。

这是我的适配器。

    public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private static final String TAG = RecyclerViewAdapter.class.getSimpleName();

    private static final int TYPE_HEADER = 0;
    private static final int TYPE_ITEM = 1;
    private List<ItemObject> itemObjects;
    private Context context;


    public RecyclerViewAdapter( Context context , List<ItemObject> itemObjects) {
        this.context = context;
        this.itemObjects = itemObjects;
    }
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_HEADER) {
            View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.header_layout, parent, false);
            return new HeaderViewHolder(layoutView);
        } else if (viewType == TYPE_ITEM) {
            View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
            return new ItemViewHolder(layoutView , context);
        }
        throw new RuntimeException("No match for " + viewType + ".");
    }
    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
        ItemObject mObject = itemObjects.get(position);
        if(holder instanceof HeaderViewHolder){
            ((HeaderViewHolder) holder).headerTitle.setText(mObject.getContents());
        }else if(holder instanceof ItemViewHolder){
            ((ItemViewHolder) holder).itemContent.setText(mObject.getContents());
        }
    }
    private ItemObject getItem(int position) {
        return itemObjects.get(position);
    }
    @Override
    public int getItemCount() {
        return itemObjects.size();
    }
    @Override
    public int getItemViewType(int position) {
        if (isPositionHeader(position))
            return TYPE_HEADER;
        return TYPE_ITEM;
    }
    private boolean isPositionHeader(int position) {
        return position == 0;
    }
}

这是我在主要活动中的方法。

recyclerView = findViewById(R.id.recyclerView);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MainActivity.this);
    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.setHasFixedSize(true);
    RecyclerViewAdapter adapter = new RecyclerViewAdapter(this , getDataSource());
    recyclerView.setAdapter(adapter);
   private List <ItemObject> getDataSource(){
  List<ItemObject> list1 = new ArrayList <ItemObject>();

        list1.add(new ItemObject("First Header",true));
        list1.add(new ItemObject("This is the item content in the first position"));
        list1.add(new ItemObject("This is the item content in the second position"));


        List <ItemObject> list2 = new ArrayList <ItemObject>();
        list2.add(new ItemObject("Second Header",true));
        list2.add(new ItemObject("This is the item content in the first position"));
        list2.add(new ItemObject("This is the item content in the second position"));


        List <ItemObject> list3 = new ArrayList <ItemObject>();
        list3.add(new ItemObject("Third Header",true));
        list3.add(new ItemObject("This is the item content in the first position"));
        list3.add(new ItemObject("This is the item content in the second position"));

        List <ItemObject> finalList = new ArrayList <ItemObject>(list1);
        finalList.addAll(list1);
        finalList.addAll(list2);
        finalList.addAll(list3);

        return finalList;
[![I get first header 2 times][1]][1]
}

这是我的项目对象类。

public class ItemObject {
    private String contents;
    boolean isHeader ;


    public ItemObject(String contents, boolean isHeader) {
        this.contents = contents;
        this.isHeader = isHeader;
    }

    public ItemObject(String contents) {

        this.contents = contents;
    }

    public String getContents() {
        return contents;
    }

    public boolean isHeader() {
        return isHeader;
    }
}

我像这样https://imgur.com/a/2YZ8DxM 得到第一个标题 2 次​​p>

【问题讨论】:

    标签: android android-recyclerview stickyrecycleview


    【解决方案1】:

    替换List <ItemObject> finalList = new ArrayList <ItemObject>(list1); finalList.addAll(list1); finalList.addAll(list2); finalList.addAll(list3);

    List <ItemObject> finalList = new ArrayList <ItemObject>(); finalList.addAll(list1); finalList.addAll(list2); finalList.addAll(list3)

    你在这里添加了两次第一个标题

    List <ItemObject> finalList = new ArrayList <ItemObject>(list1);
    

    【讨论】:

      【解决方案2】:

      List.addAll() 只是连接作为参数传递给finalListList 的项目。即你最终得到一个有 9 个项目的 List。这就是为什么您的条件 position == 0 仅适用于您的第一个标题。

      一个可能的(简单)解决方案是修改您的ItemObject 以具有指示给定项目是标头的标志(注意这是构造函数的第二个参数,true 是标头,@987654329 @ 否则)。

      private List <ItemObject> getDataSource(){
          List<ItemObject> list1 = new ArrayList <ItemObject>();
      
          list1.add(new ItemObject("First Header", true));
          list1.add(new ItemObject("This is the item content in the first position", false));
          list1.add(new ItemObject("This is the item content in the second position", false));
      
          List <ItemObject> list2 = new ArrayList <ItemObject>();
          list2.add(new ItemObject("Second Header", true));
          list2.add(new ItemObject("This is the item content in the first position", false));
          list2.add(new ItemObject("This is the item content in the second position", false));
      
          List <ItemObject> list3 = new ArrayList <ItemObject>();
          list3.add(new ItemObject("Third Header", true));
          list3.add(new ItemObject("This is the item content in the first position", false));
          list3.add(new ItemObject("This is the item content in the second position", false));
      
          List <ItemObject> finalList = new ArrayList <ItemObject>(list1);
          finalList.addAll(list1);
          finalList.addAll(list2);
          finalList.addAll(list3);
      
          return finalList;
      }
      

      然后您在适配器中的情况将类似于以下内容:

      private boolean isPositionHeader(int position) {
          ItemObject mObject = itemObjects.get(position);
          return mObject.isHeader();
      }
      

      【讨论】:

      • 我已经尝试过你的解决方案,它有效,我已经更新了我的代码,但我得到了第一个列表 2 次这样的imgur.com/a/2YZ8DxM
      猜你喜欢
      • 1970-01-01
      • 2014-11-02
      • 2022-12-26
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多