【问题标题】:RecyclerView with multiple layouts, insert/delete function and click listener具有多种布局、插入/删除功能和点击监听器的 RecyclerView
【发布时间】:2019-11-05 19:09:56
【问题描述】:

我正在开发一个工作估计应用程序,它将信息存储在房间数据库中,并通过 RecyclerView 保存对它的引用,用户可以使用它来访问数据并在需要时进行更改。

我正在使用实时数据通过片段内的观察者方法的视图模型检索对信息的引用。当用户完成表单并按下保存按钮时,此信息将存储在数据库中。

目前我开发了两个标准适配器,具有不同的数据集和单独的布局。

public class HallDetailAdapter extends RecyclerView.Adapter<HallDetailAdapter.myViewHolder> {
private List<HallDetails> mHallDetails;

public void setHallDetails(final List<HallDetails> hallDetails) {
    this.mHallDetails = hallDetails;
    notifyDataSetChanged();
}
@NonNull
@Override
public HallDetailAdapter.myViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, final int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_design,parent,false);
    return new myViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull final HallDetailAdapter.myViewHolder holder, final int position) {
    if(mHallDetails != null){
        HallDetails details = mHallDetails.get(position);
        holder.mTextView.setText(details.getName());
    }else{
        holder.mTextView.setText("No Data Entry");
    }

}

@Override
public int getItemCount() {
    if(mHallDetails != null)
        return mHallDetails.size();
    else return 0;
}
class myViewHolder extends RecyclerView.ViewHolder{
    private TextView mTextView;

    public myViewHolder(@NonNull final View itemView) {
        super(itemView);
        mTextView = itemView.findViewById(R.id.display_name);
    }
}

}

public class RoomDetailsAdapter extends RecyclerView.Adapter<RoomDetailsAdapter.myViewHolder> {

private List<RoomDetails> mRoomDetails;


public void setRoomDetails(final List<RoomDetails> roomDetails) {
    this.mRoomDetails = roomDetails;
    notifyDataSetChanged();
}

@NonNull
@Override
public RoomDetailsAdapter.myViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, final int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_design2,parent,false);
    return new myViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull final RoomDetailsAdapter.myViewHolder holder, final int position) {
    if(mRoomDetails != null) {
        RoomDetails details = mRoomDetails.get(position);
        holder.mTextView.setText(details.getName());
    }else{
        holder.mTextView.setText("No data entry");
    }

}

@Override
public int getItemCount() {
    if(mRoomDetails != null){
        return mRoomDetails.size();
    }else return 0;
}
public class myViewHolder extends RecyclerView.ViewHolder{
    private TextView mTextView;

    public myViewHolder(@NonNull final View itemView) {
        super(itemView);
        mTextView = itemView.findViewById(R.id.display_roomDetails);
    }
}

关于在 Fragment 内部调用的更改方法:

 dataViewModel.getName().observe(getActivity(), new Observer<List<HallDetails>>() {
        @Override
        public void onChanged(final List<HallDetails> hallDetails) {
            if(hallDetails != null) {
                hallDetailAdapter.setHallDetails(hallDetails);
            }
        }
    });

    dataViewModel.getGetName2().observe(getActivity(), new Observer<List<RoomDetails>>() {
        @Override
        public void onChanged(final List<RoomDetails> roomDetails) {
            if(roomDetails != null) {
                roomDetailsAdapter.setRoomDetails(roomDetails);
            }
        }
    });

我的问题是,我如何将多个布局集成到 RecyclerView 中,同时还要遵守这些功能:

  • 在回收站视图中添加和删除项目
  • 为每个显示的项目设置一个点击监听器
  • 在相应布局内显示数据,该布局已在适配器内引用,通过实时数据更新。

感谢您的帮助!

【问题讨论】:

    标签: android android-studio android-fragments android-recyclerview


    【解决方案1】:

    要在单个 RecyclerView 中显示多个布局,您必须在您的 recyclerview 适配器类中使用多个视图。

    例如,一个视图用于显示您的数据,另一个视图用于在数据项之间显示 Admob/facebook 广告。因此您的适配器类如下所示代码。

    public class StatusImageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    
    private ArrayList<String> images;
    private String path;
    private Context context;
    OnIteamClickListner listner;
    private String status;
    
    private static final int AD_VIEW_HOLDER = 0;
    private static final int CONTENT_VIEW_HOLDER = 1;
    
    public StatusImageAdapter(Context context, ArrayList<String> images, String path, OnIteamClickListner listner, String status) {
        this.images = images;
        this.path = path;
        this.context = context;
        this.listner = listner;
        this.status = status;
    }
    
    public interface OnIteamClickListner {
        void onIteamClick(View view, String action, int position, String path);
    
    }
    
    @Override
    public int getItemViewType(int position) {
    
        if (position % Const.ITEMS_PER_AD == 0 && position>1)
            return AD_VIEW_HOLDER;
        return CONTENT_VIEW_HOLDER;
    
    }
    
    @Override
    public int getItemCount() {
        return images.size();
    }
    
    
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        switch (viewType) {
            case AD_VIEW_HOLDER:
    
                View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.admob_banner_row_item, parent, false);
                return new AdViewHolder(itemView);
            case CONTENT_VIEW_HOLDER:
                // fall through
            default:
                View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.image_item, null);
                return new ContentViewHolder(itemLayoutView);
    
        }
    }
    
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
        int viewType = getItemViewType(position);
        switch (viewType) {
            case AD_VIEW_HOLDER:
                AdViewHolder adViewHolder= (AdViewHolder) holder;
                adViewHolder.adView.setVisibility(View.GONE);
                CommonMethods.loadAd(context,adViewHolder.adView);
                break;
            case CONTENT_VIEW_HOLDER:
                ContentViewHolder contentViewHolder = (ContentViewHolder) holder;
                Bitmap bitmap = BitmapFactory.decodeFile( images.get(position));
                contentViewHolder.imageView.setImageBitmap(bitmap);
                if (status.equals(Const.ONLINE)) {
                    contentViewHolder.img_download.setBackgroundResource(R.drawable.ic_download_black);
                }
                if (status.equals(Const.OFLINE)) {
                    contentViewHolder.img_download.setBackgroundResource(R.drawable.ic_delete);
                }
    
                contentViewHolder.imageView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        listner.onIteamClick(view, "View", position, path);
                    }
                });
                contentViewHolder.img_view.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        listner.onIteamClick(view, "QuickView", position, path);
    
                    }
                });
                contentViewHolder.img_download.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if (status.equals(Const.ONLINE)) {
                            listner.onIteamClick(view, "Download", position, path);
                        }
                        if (status.equals(Const.OFLINE)) {
                            listner.onIteamClick(view, "Delete", position, path);
                        }
    
                    }
                });
    
                contentViewHolder.img_share.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        listner.onIteamClick(view, "Share", position, path);
    
                    }
                });
        }
    
    
    }
    
    private class AdViewHolder extends RecyclerView.ViewHolder {
        AdView adView;
    
        public AdViewHolder(View itemView) {
            super(itemView);
            adView=itemView.findViewById(R.id.adView);
        }
    }
    
    private class ContentViewHolder extends RecyclerView.ViewHolder {
        ImageView imageView;
        ImageView img_share, img_download, img_view;
    
        public ContentViewHolder(View itemLayoutView) {
            super(itemLayoutView);
            imageView = itemView.findViewById(R.id.statusItem_imageView);
            img_share = itemView.findViewById(R.id.img_share);
            img_download = itemView.findViewById(R.id.img_download);
            img_view = itemView.findViewById(R.id.img_view);
        }
    }
    

    }

    从您的活动类文件中调用此适配器。

    StatusImageAdapter statusImageAdapter = new StatusImageAdapter(context, imageFiles, hiddenpath.getAbsolutePath(), this, Const.ONLINE);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多