【发布时间】: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逻辑只处理从数据库中删除,因为在回收器视图中,每一行都有一个位置,你应该从list和notifyItemRemoved()中删除对象。此外,适配器类不负责从数据库中删除数据。至少,您应该让 Activity 处理它,或者更好的是,遵循一些软件设计。 -
好的,谢谢。
标签: android sqlite android-recyclerview