在具有多种视图类型的Recycler View中,滚动时重复的项目

时间:2018-10-11 03:57:10

标签: android android-studio android-recyclerview recycler-adapter

我有一个带有多种视图类型和分页功能的recyclerview。在两页之后向上滚动,这些项目将不保存视图并且正在复制。我已经实现了getItemId返回唯一ID和getViewtype返回唯一值。也将适配器的setHasStableIds设置为true。期待任何帮助。 谢谢。

getItemId

if (postList.get(position).getId()== null){
        return position;
    } else{
        return postList.get(position).getId();
    }

getItemViewType

 if (postList.get(position).getPostType().equals("contest")){
            return TYPE_CONTEST;
  } else if(postList.get(position).getPostType().equals("suggestion")){
            return TYPE_SUGGESTION;
        } else{
            return TYPE_POST_POLL;
        }
    } else{
        return TYPE_HEADER;
       }

2 个答案:

答案 0 :(得分:0)

尝试这样的事情:

@Override
public int getItemViewType(int position) {
    if (isValidPosition(position)) {
        Dataset d = mDataset[position];
        if ("contest".equals(d.getViewType())) {
            return VIEW_TYPE_CONTEST;
        } else if ("suggestion".equals(d.getViewType())) {
            return VIEW_TYPE_SUGGESTION;
        }
        // all other cases here
    }
    // default type
    return VIEW_TYPE_CONTEST;
}

然后:

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Dataset d = mDataset[position];

    if (holder instanceof ContestVH) {
        ContestDataset contest = (ContestDataset) d;
        ContestVH vh = (ContestVH) holder;
        // bind your contest views here
    } else if (holder instanceof SuggestionVH) {
        SuggestionDataset suggestion = (SuggestionDataset) d;
        SuggestionVH vh = (SuggestionVH) holder;
        // bind your suggestion views here
    }
    // all other cases here
}

通过这种方式,您的String视图类型是您唯一的真理来源。

答案 1 :(得分:0)

要在recyclerview中进行分页,应使用onScrollListener

recyclerList.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        boolean isLast = isLastItemDisplaying(recyclerView);  //get last displayed item
        if (loading && isLast) {  //this check if your data is loading and if its last list item list will not load again
            loading = false;

            //get your data according to page count it will refresh your recycler list 

        }
    }
});

因为分页,您可以在回收站视图中的页面滚动中从Api获取数据。因此,数据将根据页数成块出现。为此,您可以在回收商列表中的滚动侦听器上使用,并在列表滚动时刷新数据,直到列表的最后一项到达。 我希望它会对您有所帮助:)