繁体   English   中英

从适配器 class 删除后,从 sqlite 数据库更新 RecyclerView

[英]Update RecyclerView from sqlite database after deletion from Adapter class

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

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

您需要重新打开片段以更新 recyclerView 数据。 我本可以使用 notifyDataChange,但所有这些都发生在适配器 class 中。 分片加载后,它从 SQLite 获取数据并使用设置器将此数据发送到 model class。 然后将 object 添加到 Model 的列表中,最后发送到适配器 class。

分段:

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);

}

适配器 Class:

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();
}

}

正如@Taseer Ahmad 的评论中所建议的那样,我已经更新了 onDelete 代码

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

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

        }
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM