Saya telah menambahkan gesek ke aplikasi saya, untuk menghapus catatan tertentu. Selama beberapa hari, saya menghadapi masalah dengan menampilkan data setelah menggesek. Untuk memperjelas: Katakanlah, kami memiliki dua item dalam tampilan pendaur ulang. Setiap kali kami menggesek salah satunya, yang kedua akan terlihat, tetapi tidak sampai saya menjalankan kembali aplikasi. Bagaimana saya bisa menyelesaikannya?

Aktivitas Utama

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

        }
    };
}

Adaptor

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
user11744127 19 Maret 2020, 20:15

1 menjawab

Jawaban Terbaik

Jawaban singkat:

Anda perlu menghapus pernyataan notes.clear() saat Anda menerima perubahan dalam daftar LiveData dari database melalui pengamat.

Jawaban mendetail

Saat Anda pertama kali menjalankan aplikasi, itu akan menampilkan daftar yang benar karena kondisi if (mNotes.size() > 0) tidak terpenuhi, sehingga daftar yang diterima tidak akan dihapus melalui notes.clear(), sehingga RecyclerView akan menampilkan data yang benar.

Tetapi ketika Anda menghapus catatan, kemudian ketika pengamat dipicu lagi dengan daftar baru, kondisi if (mNotes.size() > 0) akan terpenuhi, jadi Anda akan menghapus daftar yang berasal dari database sebelum memberi makan adaptor dengan itu, jadi RecyclerView akan bebas dari data.

Jadi untuk mengatasi ini silahkan ganti notes.clear(); dengan mNotes.clear();

Jadi kode yang tepat adalah:

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

Berharap itu membantu Anda. Saya tidak memeriksa sisa kode, beri tahu saya jika ada masalah lain untuk membantu lebih banyak

0
Zain 19 Maret 2020, 17:40