如何通知RecyclerView项目中的更改

时间:2016-09-20 15:54:10

标签: android sqlite android-recyclerview

这是我的问题:

我有AlbumActivity使用RecyclerView列出所有相册名称。

单击一个项目时,它将转到ImagesActivity,其中将列出相册中的所有图像。我还使用了RecyclerViewImagesActivity有一个工具栏菜单,可以添加多个图像,以防用户想要将另一个图像添加到相册中。单击菜单后,将打开另一个活动以添加数据库的图像路径。

我的问题是,当我回到ImagesActivity时,图像不会出现。仅当我再次转到AlbumActivity再次查看相册的图像时,才会显示图像。如何在ImagesActivity

中快速通知更改

这是我的适配器:

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

    static List<GettersSetters> dbList;
    static Context context;

    ImageAdapter(Context context, List<GettersSetters> dbList) {
        this.dbList = new ArrayList<GettersSetters>();
        this.context = context;
        this.dbList = dbList;

    }

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

        View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(
                R.layout.item_image, null);

        ViewHolder viewHolder = new ViewHolder(itemLayoutView);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ImageAdapter.ViewHolder holder, int position) {
        File imageFile = new File(dbList.get(position).getPath());
        if(imageFile.exists()){
            Bitmap img = decodeBitmapWithSize(dbList.get(position).getPath(),300,150, true);
            holder.imageGallery.setImageBitmap(img);
        }else{
            holder.imageGallery.setImageResource(R.drawable.not_found);
        }

    }

    @Override
    public int getItemCount() {
        return dbList.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        public ImageView imageGallery;

        public ViewHolder(View itemLayoutView) {
            super(itemLayoutView);
            imageGallery = (ImageView) itemLayoutView.findViewById(R.id.img_row);
            itemLayoutView.setOnClickListener(this);
            itemLayoutView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    Toast.makeText(context,"Delete Image",Toast.LENGTH_LONG).show();
                    return true;
                }
            });
        }

        @Override
        public void onClick(View v) {

        }
    }

4 个答案:

答案 0 :(得分:0)

添加图片后,您是否正在调用notifydatasetchanged()https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#notifyDataSetChanged()

将图像添加到ImagesActivity后,需要在dbList中调用此项。 请阅读上述链接中的文档以了解notifydatasetchanged() 此方法基本上通知Adapter dbList中的数据已更新,因此必须刷新UI。

答案 1 :(得分:0)

在向数据库添加图像路径后,您需要刷新dbList。

当您返回到Images Activity时,您将从onActivityResult的数据库中获取新的dbList。您可以按如下方式刷新dbList:

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

    public void updateList(List<GettersSetters> dbList) {
        this.dbList.clear();
        this.dbList.addAll(dbList);
        notifyDataSetChanged();
    }
}

答案 2 :(得分:0)

最常见的方法是在活动中实例化List和Adapter,并在更改列表中的数据时在适配器上调用notifyDataSetChanged。

例如,在您的Activity类中......

List<GetterSetter> list;
ImageAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    list = new ArrayList();
    adapter = new ImageAdapter(this, list);
    // you will also need to attach your adapter to your recyclerview.

    // when you are ready to modify/add/delete items from the list, just do it and call notifyDataSetChanged
    list.add(new GetterSetter());
    adapter.notifyDataSetChanged();  // This will update your recyclerview to show one item, instead of an empty list
}

简而言之,您显然会将适配器传递给List。每次更改列表中的任何数据时,请确保在适配器对象上调用notifyDataSetChanged()。

答案 3 :(得分:0)

当回到onResume方法调用中的Images Activity时,就像这样

public void onResume{
youradapter.refreshrecyclerview(); // implement this method in adpater or simply call here
adpater.notifiDataSetChanged();
}

在adpater中实现此方法,

public void refreshrecyclerview(){
notifiDataSetChanged();
}