Обновление RecyclerView из базы данных sqlite после удаления из класса Adapter - PullRequest
0 голосов
/ 05 октября 2019

Я разрабатываю новостное приложение. В этом приложении пользователь может хранить свои любимые новости. Новости хранятся в базе данных SQLite. Когда пользователь нажимает на изображение recyclerView, появляется настраиваемое диалоговое окно, включающее 3 кнопки.

Одна кнопка предназначена для чтения сохранения с помощью браузера. Он будет использовать URL-адрес, сохраненный в SQLite, чтобы открыть браузер. Вторая кнопка предназначена для удаления. Когда пользователь нажимает кнопку удаления, вызывается метод, и данные удаляются, но он не обновляет данные recyclerView.

Вам необходимо повторно открыть фрагмент, чтобы обновить данные recyclerView. Я мог бы использовать notifyDataChange, но все это происходит в классе адаптера. После загрузки фрагментов он получает данные из SQLite и отправляет эти данные в класс модели с помощью установщиков. Затем этот объект добавляется в Список этой Модели и в конце отправляется в класс адаптера.

Фрагмент:

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

}

1 Ответ

0 голосов
/ 06 октября 2019

Как указано в комментариях @Taseer Ahmad, я обновил код удаления

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

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

        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...