Recyclerview не показывает никаких данных после считывания одной из строк - PullRequest
1 голос
/ 19 марта 2020

Я добавил в свое приложение, чтобы удалить указанную заметку. В течение пары дней у меня возникла проблема с отображением данных после пролистывания. Для пояснения: допустим, у нас есть два элемента в представлении переработчика. Всякий раз, когда мы проводим одним из них, второй должен быть видимым, но только когда я перезапущу приложение. Как я могу решить это?

Основная деятельность

   public class MainActivity extends AppCompatActivity implements MemoAdapter.OnNoteListener {


    private static final String TAG = "MainActivity";

    //Vars
    private ArrayList<Note> mNotes = new ArrayList<>();
    private MemoRepository mRepository;
    private MemoAdapter mMemoAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRepository = new MemoRepository(this);
        Toolbar toolbar = (Toolbar) findViewById(R.id.memoToolbar);
        setSupportActionBar(toolbar);
        setTitle("My memos");

        initRecyclerView();

    }
    //This method would be called after getting result from memo_content such as new memo, or edited existing memo.
    @Override
    protected void onResume() {
        super.onResume();
        getMemos();
    }

    private void getMemos(){
        mRepository.getAllMemos().observe(this, new Observer<List<Note>>() {
            @Override
            public void onChanged(List<Note> notes) {
                if (mNotes.size() > 0){
                    notes.clear();
                }
                if (notes != null){
                    mNotes.addAll(notes);
                    mMemoAdapter.watchMemoChanges((ArrayList<Note>) notes);
                }
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.icon_menu, menu);
        return super.onCreateOptionsMenu(menu);
    }
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.addNewNote:
                Toast.makeText(this, "Click!", Toast.LENGTH_SHORT).show();
                startActivity(new Intent(this, memo_content.class));

                break;
            case R.id.deleteAllNotes:
                Toast.makeText(this, "Delete!", Toast.LENGTH_SHORT).show();
                mRepository.deleteAllMemos();
                break;

        }
        return super.onOptionsItemSelected(item);
    }
    private void initRecyclerView(){
        //UI
        RecyclerView mRecyclerView = findViewById(R.id.recyclerView);
        mRecyclerView.setHasFixedSize(true);

        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this);
        mMemoAdapter = new MemoAdapter(mNotes, this);
        new ItemTouchHelper(itemTouch).attachToRecyclerView(mRecyclerView);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mMemoAdapter);

    }
    @Override
    public void onMemoClick(int position) {
        Intent intent = new Intent(this, memo_content.class);
        intent.putExtra("memo_content", mNotes.get(position));
        startActivity(intent);
    }

    private ItemTouchHelper.SimpleCallback itemTouch = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.START | ItemTouchHelper.LEFT) {
        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
            mRepository.deleteMemo(mNotes.get(viewHolder.getAdapterPosition()));
            Log.d(TAG, "onSwiped: "+mNotes.get(viewHolder.getAdapterPosition()));

        }
    };
}

Адаптер

public class MemoAdapter extends RecyclerView.Adapter<MemoAdapter.MemoViewHolder> {

private ArrayList<Note> mNotes;
private OnNoteListener mListener;

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

    TextView title, timestamp;

    private MemoViewHolder(@NonNull final View itemView) {
        super(itemView);
        this.title = (TextView) itemView.findViewById(R.id.title);
        this.timestamp = (TextView) itemView.findViewById(R.id.timestamp);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        mListener.onMemoClick(getAdapterPosition());
    }
}

public MemoAdapter(ArrayList<Note> notes, OnNoteListener listener) {
    this.mNotes = notes;
    this.mListener = listener;
}

@NonNull
@Override
public MemoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_memo, parent, false);
    return new MemoViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MemoViewHolder holder, int position) {
    holder.title.setText(mNotes.get(position).getTitle());
    holder.timestamp.setText(mNotes.get(position).getTimestamp());
}

public void watchMemoChanges(ArrayList<Note> notes){
    this.mNotes = notes;
    notifyDataSetChanged();
}



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

public interface OnNoteListener{
   void onMemoClick(int position);
}

1 Ответ

0 голосов
/ 19 марта 2020

Краткий ответ:

Необходимо удалить оператор notes.clear(), когда вы получаете изменение в списке LiveData из базы данных через наблюдателя.

Подробный ответ

Когда вы в первый раз запустите свое приложение, оно покажет весь правильный список, потому что условие if (mNotes.size() > 0) не выполнено, и полученный список не будет очищен через notes.clear(), поэтому RecyclerView отобразит правильные данные.

Но когда вы удаляете заметку, то, когда наблюдатель снова запускается с новым списком, будет выполнено условие if (mNotes.size() > 0), поэтому вы очистит список, поступающий из базы данных, перед тем, как снабдить адаптер адаптером, поэтому RecyclerView будет свободен от данных.

Поэтому для решения этой проблемы замените notes.clear(); на mNotes.clear();

Таким образом, правильный код будет:

private void getMemos(){
    mRepository.getAllMemos().observe(this, new Observer<List<Note>>() {
        @Override
        public void onChanged(List<Note> notes) {
            if (mNotes.size() > 0){
                mNotes.clear();
            }
            if (notes != null){
                mNotes.addAll(notes);
                mMemoAdapter.watchMemoChanges((ArrayList<Note>) notes);
            }
        }
    });
}

Wi sh, который поможет вам. Я не проверял остальную часть кода, пожалуйста, дайте мне знать, если есть еще одна проблема, чтобы помочь больше

...