Android 带有标题的RecyclerView获取重复项

Android 带有标题的RecyclerView获取重复项,android,android-recyclerview,activeandroid,Android,Android Recyclerview,Activeandroid,我有一个recyclerview项目列表,在适配器中,我有一个按钮,用于将项目作为收藏夹添加到活动android数据库中,如下代码: viewholder.favoriteWP_IV.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Favorites favorites = new Favorites();

我有一个recyclerview项目列表,在适配器中,我有一个按钮,用于将项目作为收藏夹添加到
活动android
数据库中,如下代码:

viewholder.favoriteWP_IV.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Favorites favorites = new Favorites(); // Model class for db crud

            favorites.setFavoritesId(UUID.randomUUID().toString());
            favorites.setLargeImgURL(pixaImages.getLargeImgURL());
            favorites.setPreviewImgURL(pixaImages.getPreviewImgURL());
            favorites.setImageId(favorites.getImageId());

            favorites.save();
            Log.d(TAG, "Fav_id:\t" + favorites.getId());
            Log.d(TAG, "Favorites Id:\t" + favorites.getFavoritesId());


            //TODO: 6/13/2018 Fix Duplicate Favorite WP
            Toast.makeText(context, "Added to Favorites", Toast.LENGTH_SHORT).show();

        }
    });
 public List<Favorites> getAllFavorites() {
    return new Select()
            .all()
            .from(Favorites.class)
            .orderBy("favorites_id ASC")
            .execute();
}

private void getFavorites() {
    favsRV.setHasFixedSize(true);
    favsRV.setLayoutManager(new LinearLayoutManager(this));

    AdapterHeaderItem headerItem = new AdapterHeaderItem();
    headerItem.setHeaderIcon(R.drawable.drawer_header_trimmed);
    headerItem.setHeaderTitle("you can toggle through your favorite wallpapers using the wallpaper widget on your home screen");
    objectList.add(headerItem);

    //itemsList = getAllFavorites();
    Favorites favorites = new Favorites();
    for (int i = 0; i < getAllFavorites().size(); i++) {
        favorites.setFavoritesId(getAllFavorites().get(i).getFavoritesId());
        favorites.setLargeImgURL(getAllFavorites().get(i).getLargeImgURL());
        favorites.setPreviewImgURL(getAllFavorites().get(i).getPreviewImgURL());
        favorites.setImageId(getAllFavorites().get(i).getImageId());
        Log.d(TAG, "All Favs Ids:\t" + getAllFavorites().get(i).getFavoritesId());
        objectList.add(favorites);
    }
    Log.d(TAG, "Favorites List Size:\t" + objectList.size());

    adapter = new FavoritesAdapter(this, objectList);
    favsRV.setAdapter(adapter);

}
在我的
收藏夹活动中
,我检索了所有项目,并将它们显示在一个recyclerview中,如下面的代码所示:

viewholder.favoriteWP_IV.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Favorites favorites = new Favorites(); // Model class for db crud

            favorites.setFavoritesId(UUID.randomUUID().toString());
            favorites.setLargeImgURL(pixaImages.getLargeImgURL());
            favorites.setPreviewImgURL(pixaImages.getPreviewImgURL());
            favorites.setImageId(favorites.getImageId());

            favorites.save();
            Log.d(TAG, "Fav_id:\t" + favorites.getId());
            Log.d(TAG, "Favorites Id:\t" + favorites.getFavoritesId());


            //TODO: 6/13/2018 Fix Duplicate Favorite WP
            Toast.makeText(context, "Added to Favorites", Toast.LENGTH_SHORT).show();

        }
    });
 public List<Favorites> getAllFavorites() {
    return new Select()
            .all()
            .from(Favorites.class)
            .orderBy("favorites_id ASC")
            .execute();
}

private void getFavorites() {
    favsRV.setHasFixedSize(true);
    favsRV.setLayoutManager(new LinearLayoutManager(this));

    AdapterHeaderItem headerItem = new AdapterHeaderItem();
    headerItem.setHeaderIcon(R.drawable.drawer_header_trimmed);
    headerItem.setHeaderTitle("you can toggle through your favorite wallpapers using the wallpaper widget on your home screen");
    objectList.add(headerItem);

    //itemsList = getAllFavorites();
    Favorites favorites = new Favorites();
    for (int i = 0; i < getAllFavorites().size(); i++) {
        favorites.setFavoritesId(getAllFavorites().get(i).getFavoritesId());
        favorites.setLargeImgURL(getAllFavorites().get(i).getLargeImgURL());
        favorites.setPreviewImgURL(getAllFavorites().get(i).getPreviewImgURL());
        favorites.setImageId(getAllFavorites().get(i).getImageId());
        Log.d(TAG, "All Favs Ids:\t" + getAllFavorites().get(i).getFavoritesId());
        objectList.add(favorites);
    }
    Log.d(TAG, "Favorites List Size:\t" + objectList.size());

    adapter = new FavoritesAdapter(this, objectList);
    favsRV.setAdapter(adapter);

}
这是我的模型课:

import com.activeandroid.Model;
import com.activeandroid.annotation.Column;
import com.activeandroid.annotation.Table;

@Table(name = "favorites")
public class Favorites extends Model{

  @Column(name = "favorites_id")
  public String favoritesId;

  @Column(name = "image_id")
  public int imageId;

  @Column(name = "large_img_url")
  public String largeImgURL;

  @Column(name = "preview_img")
  public String previewImgURL;

  public Favorites() { }

  public Favorites(String favoritesId, int imageId, String largeImgURL, String previewImgURL) {
      this.favoritesId = favoritesId;
      this.imageId = imageId;
      this.largeImgURL = largeImgURL;
      this.previewImgURL = previewImgURL;
  }

  public String getFavoritesId() {
      return favoritesId;
  }

  public void setFavoritesId(String favoritesId) {
      this.favoritesId = favoritesId;
  }

  public int getImageId() {
      return imageId;
  }

  public void setImageId(int imageId) {
      this.imageId = imageId;
  }

  public String getLargeImgURL() {
      return largeImgURL;
  }

  public void setLargeImgURL(String largeImgURL) {
      this.largeImgURL = largeImgURL;
  }

  public String getPreviewImgURL() {
      return previewImgURL;
  }

  public void setPreviewImgURL(String previewImgURL) {
      this.previewImgURL = previewImgURL;
  }
}
但是这个代码块给了我三个项目的列表,一个项目重复了三次。我想这是因为代码的变化。适配器工作正常,但在活动中,我获取了错误的结果

以下是我的适配器代码:

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

private static final String TAG = FavoritesAdapter.class.getSimpleName();

private final Context context;
private List<Object> itemsList;

public static final int HEADER_VIEW = 0;
public static final int ITEMS_VIEW = 1;

public FavoritesAdapter(Context context, List<Object> itemsList) {
    this.context = context;
    this.itemsList = itemsList;
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    if (viewType == HEADER_VIEW) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.app_adapter_header_layout, parent, false);
        return new AdapterHeaderItemViewHolder(view);
    } else if (viewType == ITEMS_VIEW) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.favorites_item_layout, parent, false);
        return new FavoritesViewHolder(view);
    }
    throw new RuntimeException("No matching viewTypes");
}

@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof AdapterHeaderItemViewHolder) {
        AdapterHeaderItem header = (AdapterHeaderItem) itemsList.get(position);
        ((AdapterHeaderItemViewHolder) holder).headerTitleTV.setText(header.getHeaderTitle());

        Picasso.with(context)
                .load(header.getHeaderIcon())
                .placeholder(R.drawable.drawer_header_trimmed)
                .into(((AdapterHeaderItemViewHolder) holder).headerIconIV);

    } else if (holder instanceof FavoritesViewHolder) {
        final Favorites favorites = (Favorites) itemsList.get(position);

        Picasso.with(context)
                .load(favorites.getLargeImgURL())
                .placeholder(R.mipmap.ic_launcher)
                .into(((FavoritesViewHolder) holder).favoriteWPImg);

        ((FavoritesViewHolder) holder).removeTV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d(TAG, "Adapter VH Posn:\t" + holder.getAdapterPosition());

                String fav_id = favorites.getFavoritesId();
                Log.d(TAG, "Favorites+id:\t" + fav_id);
                removeAtPosition(holder.getAdapterPosition(), fav_id);
            }
        });

        ((FavoritesViewHolder) holder).previewTV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent previewIntent = new Intent(context, PreviewWallPaperActivity.class);
                previewIntent.putExtra("fav_id", favorites.getFavoritesId());
                previewIntent.putExtra("large_url", favorites.getLargeImgURL());
                previewIntent.putExtra("preview_url", favorites.getPreviewImgURL());
                context.startActivity(previewIntent);
            }
        });

    }
}

private void removeAtPosition(int position, String id) {
    Log.d(TAG, "id in method:\t" + id);
    new Delete()
            .from(Favorites.class)
            .where("favorites_id=?", id)
            .execute();
    Log.d(TAG, "Favorite Removed from db");
    itemsList.remove(position);
    notifyItemRemoved(position);
    notifyItemRangeChanged(position, itemsList.size());

    Toast.makeText(context, "Removed From Favorites", Toast.LENGTH_SHORT).show();

}

@Override
public int getItemCount() {
    if (itemsList == null) {
        return 0;
    }
    return itemsList.size();
}

@Override
public int getItemViewType(int position) {
    if (isPositionHeader(position))
        return HEADER_VIEW;
    return ITEMS_VIEW;
}

private boolean isPositionHeader(int position) {
    return position == 0;
}

}
公共类FavoritesAdapter扩展了RecyclerView.Adapter{
私有静态最终字符串标记=FavoritesAdapter.class.getSimpleName();
私人最终语境;
私人物品清单;
公共静态最终int头_视图=0;
公共静态最终整数项\u视图=1;
公共收藏夹适配器(上下文、列表项列表){
this.context=上下文;
this.itemsList=itemsList;
}
@非空
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
if(视图类型==标题\视图){
View View=LayoutInflater.from(parent.getContext()).flate(R.layout.app\u adapter\u header\u layout,parent,false);
返回新适配器HeaderItemViewHolder(视图);
}else if(viewType==项目\视图){
View View=LayoutInflater.from(parent.getContext()).flate(R.layout.favorites\u item\u布局,parent,false);
返回新收藏夹查看文件夹(视图);
}
抛出新的RuntimeException(“没有匹配的视图类型”);
}
@凌驾
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder,int位置){
if(适配器HeaderItemViewHolder的支架实例){
AdapterHeaderItem头=(AdapterHeaderItem)itemsList.get(位置);
((AdapterHeaderItemViewHolder)holder).headerTitleTV.setText(header.getHeaderTitle());
毕加索。与(上下文)
.load(header.getHeaderIcon())
.占位符(R.可绘制.抽屉\页眉\修剪)
.进入(((AdapterHeaderItemViewHolder)holder)。headerIconIV);
}else if(FavoritesViewHolder的持有者实例){
最终收藏夹=(收藏夹)itemsList.get(位置);
毕加索。与(上下文)
.load(收藏夹.getLargeImgURL())
.占位符(R.mipmap.ic_启动器)
.进入(((收藏夹)持有者)。收藏夹WPIMG);
((FavoritesViewHolder)holder)。移除v.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Log.d(标记“适配器VH位置:\t”+holder.getAdapterPosition());
字符串fav_id=favorites.getFavoritesId();
Log.d(标记“收藏夹+id:\t”+fav_id);
移除位置(holder.getAdapterPosition(),fav_id);
}
});
((FavoritesViewHolder)holder).previewTV.setOnClickListener(新视图.OnClickListener()){
@凌驾
公共void onClick(视图){
Intent previewIntent=新的Intent(上下文,PreviewAllPaperActivity.class);
previewIntent.putExtra(“fav_id”,favorites.getFavoritesId());
previewIntent.putExtra(“大url”,favorites.getLargeImgURL());
previewIntent.putExtra(“preview_url”,favorites.getPreviewImgURL());
上下文。起始触觉(previewIntent);
}
});
}
}
私有void removetposition(int位置,字符串id){
Log.d(标记,方法:\t“+id中的id);
新删除()
.from(收藏夹.class)
.where(“收藏夹_id=?”,id)
.execute();
Log.d(标记“从数据库中删除收藏夹”);
项目列表。移除(位置);
已移除(位置)的项目;
notifyItemRangeChanged(位置,itemsList.size());
Toast.makeText(上下文,“从收藏夹中删除”,Toast.LENGTH_SHORT.show();
}
@凌驾
public int getItemCount(){
if(itemsList==null){
返回0;
}
return itemsList.size();
}
@凌驾
public int getItemViewType(int位置){
if(isPositionHeader(位置))
返回页眉视图;
返回项目(u视图);;
}
专用布尔值isPositionHeader(int位置){
返回位置==0;
}
}
我认为问题在于循环和插入适配器列表:

itemsList = getAllFavorites();

    Favorites favorites = new Favorites();
    for (int i = 0; i < getAllFavorites().size(); i++) {
        favorites.setFavoritesId(getAllFavorites().get(i).getFavoritesId());
        favorites.setLargeImgURL(getAllFavorites().get(i).getLargeImgURL());
        favorites.setPreviewImgURL(getAllFavorites().get(i).getPreviewImgURL());
        favorites.setImageId(getAllFavorites().get(i).getImageId());
        Log.d(TAG, "All Favs Ids:\t" + getAllFavorites().get(i).getFavoritesId());
        objectList.add(favorites);
    }

    //objectList.add(itemsList); // I have tried adding the first list of Favorite model class into the adapter list but it gives `classcast exception: Model class can't be cast to ArrayList`
itemsList=getAllFavorites();
收藏夹=新收藏夹();
对于(int i=0;i

有人能帮我理解为什么同一件商品会出现多次吗?谢谢。

你能提供你的适配器代码吗?@gianhtran,检查againit的代码是否正确,你添加项目列表的循环是否正常,我会再次检查,而且,你可以使用objectList.addAll(itemsList)从log.d(标记,“所有Favs ID:\t”+getAllFavorites().get(I).getFavoritesId())查看结果日志;可以吗?是的,目前我有三个项目,它显示了所有三个项目的正确的非重复ID。