簡體   English   中英

從適配器外部更改 RecyclerView.ViewHolder 布局

[英]Change RecyclerView.ViewHolder Layout from outside Adapter

我有一個帶有recyclerview的布局。

在這個recyclerview中,我有 2 種類型的布局:常規 + 加載。

這個recyclerview顯示了一個 3x3 項目的網格,對於每 5 個項目,我為接下來的 5 個項目進行分頁。在進行分頁時,每個第 5 個項目顯示加載,直到收到該數據。

但是,在最后一批中,它會加載最后一個項目,並將加載視圖保持為最后一個項目。

為了克服這個問題,我必須重新加載整個recyclerview ,這對我來說似乎是錯誤的。

當它是最后一批時,如何更新最后一個項目的視圖類型?

我的代碼如下所示:

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

    private List<DiscoverItems> discoverItems;
    private FirebaseFirestore db;
    private FirebaseAuth auth;

    private boolean isLoadingFlag;

    interface OnDiscoverItemClickListener {
        void onClick(DiscoverItems discoverItems);
    }

    private OnDiscoverItemClickListener listener;

    public MoreItemsAdapter(List<DiscoverItems> discoverItems, Boolean isLoadingFlag, OnDiscoverItemClickListener listener) {
        this.discoverItems = discoverItems;
        this.isLoadingFlag = isLoadingFlag;
        this.listener = listener;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view;

        if (viewType == AppConstants.ITEMS_LOADING_KEY) {
            view = LayoutInflater.from( parent.getContext() ).inflate(
                    R.layout.item_loading_items, parent, false );
            return new LoadingViewHolder( view );
        } else {
            view = LayoutInflater.from( parent.getContext() ).inflate(
                    R.layout.item_item_more,
                    parent,
                    false );
            return new MoreItemsViewHolder( view );
        }

    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
        viewHolder.setIsRecyclable( false );

        if (viewHolder instanceof MoreItemsViewHolder) {
            ((MoreItemsViewHolder) viewHolder).bind( (discoverItems.get( position )) );
        } else if (viewHolder instanceof LoadingViewHolder) {
            showLoadingView( (LoadingViewHolder) viewHolder, position );
        }

    }

    @Override
    public int getItemViewType(int position) {

        if (position == discoverItems.size() - 1 && discoverItems.size() > AppConstants.LOAD_MORE_MORE && isLoadingFlag) {
            return AppConstants.ITEMS_LOADING_KEY;
        } else {
            return AppConstants.ITEMS_REGULAR_KEY;
        }

    }


    @Override
    public int getItemCount() {
        return discoverItems.size();
    }

    class MoreItemsViewHolder extends RecyclerView.ViewHolder {

        Button tv_Link;
        CardView cardView;

        private MoreItemsViewHolder(View itemView) {
            super( itemView );
            cardView = itemView.findViewById( R.id.imagecard );
            tv_Link = itemView.findViewById( R.id.tv_Link );
        }

        private void bind(DiscoverItems discoverItems) {
            this.discoverItems = discoverItems;
                DO SOMETHING
        }
    }

    private static class LoadingViewHolder extends RecyclerView.ViewHolder {
        ProgressBar progressBar;

        public LoadingViewHolder(@NonNull View itemView) {
            super( itemView );
            progressBar = itemView.findViewById( R.id.progressBar );
        }
    }

    private void showLoadingView(MoreItemsAdapter.LoadingViewHolder viewHolder, int position) {
    }


}

在適配器外部的代碼中,我為最后一批執行了以下操作(將第二個參數設置為 false 以使其了解它是常規視圖):

rv_More.invalidate();
rv_More.scrollToPosition( items.size() - loadingNumber - 1 );

moreItemsAdapter = new MoreItemsAdapter( items, false, listener );
rv_More.getItemAnimator().setChangeDuration( 0 );
rv_More.setAdapter( moreItemsAdapter );
isLoading = true;

我不能這樣做:

rv_More.setViewType(position, Type)

謝謝

不要直接修改您的視圖持有者。 相反,如果您只想使回收站中的特定項目失效,請對您的回收站執行以下操作:

myRecycler.getAdapter().notifyItemChanged(itemPosition);

確保您的數據正確反映了調用時的更改。 它將強制回收商僅重新加載您指定的特定項目(按位置)。

暫無
暫無

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

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