![](/img/trans.png)
[英]Build AlerDialog outside of an Activity (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.