Android 带有标题的RecyclerView获取重复项
我有一个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();
活动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。