簡體   English   中英

在具有多種視圖類型的Recycler View中,滾動時重復的項目

[英]In Recycler View with multiple view types items duplicating on scrollup

我有一個具有多種視圖類型和分頁功能的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;
       }

嘗試這樣的事情:

@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視圖類型就是您唯一的真理來源。

對於在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 

        }
    }
});

因為在分頁中,您可以在Recycler視圖中的頁面滾動中從Api獲取數據。 因此,數據將根據頁數成塊出現。 為此,您可以在回收商列表中的滾動偵聽器上使用,並在列表滾動時刷新數據,直到列表的最后一項到達。 我希望它將對您有幫助:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM