在RecyclerView中添加静态默认项

Joe*_*Joe 2 java android android-recyclerview

我有一个水平RecyclerView显示来自用户设备的 7 张图像(随着用户不断拍照而变化)。我想在 7 个图像的末尾添加一个默认图标,具有 onclick 功能。我该怎么做呢?

像这样的东西: 在此输入图像描述

在上图中,加号图标应该是默认图标,但它应该位于图像的末尾。

更新:

最近的照片适配器.java

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

    // Variables
    private Context mContext;
    private ArrayList<String> mImage;
    private int VIEW_TYPE_DEFAULT = 0;
    private int VIEW_TYPE_IMAGE = 1;

    // Limit the recent photo selection
    int RECENT_PHOTO_LIMIT = 7;

    public RecentPhotosAdapter(Context mContext, ArrayList<String> mImage) {
        this.mContext = mContext;
        this.mImage = mImage;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        if (viewType == VIEW_TYPE_IMAGE) {

            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recent_photos_item, parent, false);
            return new ViewHolder(view);
        }
        else {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.default_select_photos_item, parent, false);
            return new ViewHolder(view);
        }

    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        if(position < Math.min(mImage.size(), RECENT_PHOTO_LIMIT)){
            String images = mImage.get(position);

            // Recent Photos
            Glide.with(mContext)
                    .load(images)
                    .placeholder(R.drawable.background_gallery_placeholder)
                    .transform(new CenterCrop(), new RoundedCorners(30))
                    .into(holder.recent_photos_iv);


            // Default select photos

            holder.recent_photos_iv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    // Do something here
                    // Take user to image select slider
                }
            });
        }
        else {
            //code for default view
        }
    }

    @Override
    public int getItemViewType(int position) {
        return (position == mImage.size()) ? VIEW_TYPE_DEFAULT : VIEW_TYPE_IMAGE;
    }

    @Override
    public int getItemCount() {
        return Math.min(mImage.size(), RECENT_PHOTO_LIMIT) + 1;
    }

    public class ViewHolder extends RecyclerView.ViewHolder{

        ImageView recent_photos_iv;
        ImageView default_select_photo_iv;

        public ViewHolder(View itemView) {
            super(itemView);
            recent_photos_iv = itemView.findViewById(R.id.recent_photos_iv);
            default_select_photo_iv = itemView.findViewById(R.id.default_select_photo_iv);

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Alp*_*a 1 5

您可以通过将默认图标设置为适配器的“ViewType”来实现此目的。重写 getItemViewType 为最后一项返回不同的值。

@Override
public int getItemViewType(int position) {
    return (position == mData.size()) ? VIEW_TYPE_DEFAULT : VIEW_TYPE_IMAGE;
}
Run Code Online (Sandbox Code Playgroud)

现在在 onCreateViewHolder 中,处理两种视图类型。

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    if (viewType == VIEW_TYPE_IMAGE) {

        //Create viewholder for your images
    }
    else {

        //Create viewholder for default view
    }
}
Run Code Online (Sandbox Code Playgroud)

将 1 添加到 ItemList 大小以容纳此额外视图:

@Override
public int getItemCount() {
    return mData.size() + 1;
}
Run Code Online (Sandbox Code Playgroud)

您更新的代码:

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

    // Variables
    private Context mContext;
    private ArrayList<String> mImage;
    private int VIEW_TYPE_DEFAULT=0;
    private int VIEW_TYPE_IMAGE=1;

    public RecentPhotosAdapter(Context mContext, ArrayList<String> mImage) {
        this.mContext = mContext;
        this.mImage = mImage;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

      if (viewType == VIEW_TYPE_IMAGE) {

         View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recent_photos_item, parent, false);
        return new ViewHolder(view);
        }
      else {

          //Create viewholder for default view
        }

    }
    
    @Override
    public int getItemViewType(int position) {
    return (position == Math.min(mImage.size(), RECENT_PHOTO_LIMIT)) ?VIEW_TYPE_DEFAULT : VIEW_TYPE_IMAGE;
    }
   
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        if(position < Math.min(mImage.size(), RECENT_PHOTO_LIMIT)){
        String images = mImage.get(position);

        Glide.with(mContext)
                .load(images)
                .placeholder(R.drawable.background_gallery_placeholder)
                .transform(new CenterCrop(), new RoundedCorners(30))
                .into(holder.recent_photos_iv);

        holder.recent_photos_iv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // Do something here
                // Take user to image select slider
            }
        });
       }
       else {
            //code for default view
        }
    }

    @Override
    public int getItemCount() {
        // Limit the recent photo selection
        int RECENT_PHOTO_LIMIT = 7;
        return Math.min(mImage.size(), RECENT_PHOTO_LIMIT)+1;
    }

    public class ViewHolder extends RecyclerView.ViewHolder{

        ImageView recent_photos_iv;

        public ViewHolder(View itemView) {
            super(itemView);
            recent_photos_iv = itemView.findViewById(R.id.recent_photos_iv);
        }
    }
}
 
Run Code Online (Sandbox Code Playgroud)