【问题标题】:Update RecyclerView from sqlite database after deletion from Adapter class从适配器类删除后从 sqlite 数据库更新 RecyclerView
【发布时间】:2019-10-05 19:19:32
【问题描述】:

我正在开发一个新闻应用程序。在这个应用程序中,用户可以存储它最喜欢的新闻。新闻存储在 SQLite 数据库中。当用户点击 recyclerView 图片时,会出现一个自定义对话框,其中包含 3 个按钮。

一个按钮用于使用浏览器读取存储。它将使用存储在 SQLite 中的 URL 打开浏览器。第二个按钮用于删除。当用户单击删除按钮时,会调用该方法并删除数据,但不会更新 recyclerView 数据。

您需要重新打开片段以更新 recyclerView 数据。我本可以使用 notifyDataChange ,但所有这些都发生在 Adapter 类中。片段加载后,它从 SQLite 获取数据并使用 setter 将此数据发送到模型类。然后将该对象添加到该模型的列表中,最后发送到适配器类。

片段:

private void getDataFromSQLite() {

    SQLiteDatabase db = databaseHelper.getReadableDatabase();
    String selectQuery = "SELECT  * FROM " + DatabaseHelper.TABLE_NAME;
    Cursor cursor = db.rawQuery(selectQuery,null);

    if (cursor.moveToFirst()) {
        do {
            NewsModel newsModel = new NewsModel();
            newsModel.setSourceName(cursor.getString(1));
            newsModel.setAuthor(cursor.getString(2));
            newsModel.setTitle(cursor.getString(3));
            newsModel.setDescription(cursor.getString(4));
            newsModel.setUrl(cursor.getString(5));
            newsModel.setUrlToImage(cursor.getString(6));
            newsModel.setPublishedAt(cursor.getString(7));
            newsModelList.add(newsModel);

        } while (cursor.moveToNext());
    }
    setRvadapter(newsModelList);
    cursor.close();
}


public void setRvadapter (List<NewsModel> lst) {

    myAdapter = new RvAdapterFavourite(getActivity(),lst) ;
    myrv.setLayoutManager(new LinearLayoutManager(getActivity()));
    myrv.setAdapter(myAdapter);

}

适配器类:

public class RvAdapterFavourite extends RecyclerView.Adapter<RvAdapterFavourite.MyViewHolder> {

private RequestOptions options ;
private Context mContext ;
private List<NewsModel> mData ;
private DatabaseHelper databaseHelper;

public RvAdapterFavourite(Context mContext, List<NewsModel> list) {


    this.mContext = mContext;
    this.mData = list;
    options = new RequestOptions()
            .centerCrop()
            .placeholder(R.drawable.ic_load)
            .error(R.drawable.loading_shape);
    databaseHelper = new DatabaseHelper(mContext);
}

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

    LayoutInflater mInflater = LayoutInflater.from(mContext);
    View view = mInflater.inflate(R.layout.news_item_row_favourite, parent, false);
    // click listener here
    return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {


    holder.tvAuthor.setText(String.format("Author: %s", mData.get(position).getAuthor()));
    holder.tvSourceName.setText(String.format("Source: %s", mData.get(position).getSourceName()));
    holder.tvPublishedAt.setText(String.format("Published At: %s", mData.get(position).getPublishedAt()));
    holder.tvTitle.setText(mData.get(position).getTitle());
    holder.tvDescription.setText(mData.get(position).getDescription());

    //set listener on pic to read full story in browser
    holder.newsThumbnail.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            showOptionsDialog(mData.get(holder.getAdapterPosition()).getUrl());
        }
    });

}

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

class MyViewHolder extends RecyclerView.ViewHolder {

    TextView tvAuthor,tvSourceName,tvPublishedAt,tvTitle,tvDescription;
    ImageView newsThumbnail;


    MyViewHolder(View itemView) {
        super(itemView);
        tvAuthor = itemView.findViewById(R.id.author);
        tvSourceName = itemView.findViewById(R.id.sourceName);
        tvPublishedAt = itemView.findViewById(R.id.publishedAt);
        tvTitle = itemView.findViewById(R.id.newsTitle);
        tvDescription = itemView.findViewById(R.id.newsDescription);
        newsThumbnail = itemView.findViewById(R.id.NewsImage);


    }
}

//show dialog box on click
@SuppressLint("SetTextI18n")
private void  showOptionsDialog(final String linkToStory)
{

    btnDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            databaseHelper.deleteFromData(linkToStory);
            dialog.dismiss();
        }
    });

    dialog.show();
}

}

【问题讨论】:

  • 你的onClick 逻辑只处理从数据库中删除,因为在回收器视图中,每一行都有一个位置,你应该从listnotifyItemRemoved() 中删除对象。此外,适配器类不负责从数据库中删除数据。至少,您应该让 Activity 处理它,或者更好的是,遵循一些软件设计。
  • 好的,谢谢。

标签: android sqlite android-recyclerview


【解决方案1】:

正如@Taseer Ahmad 的 cmets 所建议的,我已经更新了 onDelete 代码

btnDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            mData.remove(position);
            notifyItemChanged(position);
            databaseHelper.deleteFromData(linkToStory);
            dialog.dismiss();

        }
    });

【讨论】:

    猜你喜欢
    • 2019-01-15
    • 2017-08-18
    • 1970-01-01
    • 2021-01-24
    • 2020-05-07
    • 1970-01-01
    • 2016-09-17
    • 2018-05-29
    • 1970-01-01
    相关资源
    最近更新 更多