Загрузить значения базы данных в RecyclerView, используя ArrayList и адаптер - PullRequest
0 голосов
/ 11 сентября 2018

У меня в Android Notes добавление, удаление, обновление приложения.

В моей основной деятельности у меня есть представление Recycler, которое извлекает данные из класса базы данных с использованием массива.

Ниже приведен класс DatabaseValues:

DatabaseValues.java

  ....
  initial code
  ....
  public List getAllNotes()
  {
    List<Note> notesList = new ArrayList<Note>();;
    Cursor cursor = database.rawQuery("SELECT * FROM note", null);
    if (cursor.moveToFirst()) {
        do {
            Note n = new Note();
            n.setId(cursor.getInt(0));
            n.setTitle(cursor.getString(1));
            n.setDescription(cursor.getString(2));
            notesList.add(n);
        } while (cursor.moveToNext());
    }
    return notesList;
}

Этот notesList возвращается в MainActivity: MainActivity.java

public class MainActivity extends AppCompatActivity
{
  protected RecyclerView recyclerView;
  protected DatabaseValues dbvalues;
  protected List<Note> noteList;
  protected NotesAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View view)
        {
            Intent newNote = new Intent(MainActivity.this, EditNoteActivity.class);
            startActivity(newNote);//onclick new note activity opens
        }
    });

    recyclerView = findViewById(R.id.recyclerview);
    noteList = new ArrayList<>();

    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());


    //ANR 
    final List<Note> n = dbvalues.getAllNotes(); //retrieving values from DB
    if (!n.isEmpty()) //error occurs since there are no notes in db
    {
        for (int i = 0; i < n.size(); i++)
        {
            noteList.add(n.get(i));
        }
    }

    if(noteList.isEmpty())
    {
        recyclerView.setAdapter(null);
    }
    else
    {
        adapter = new NotesAdapter(noteList, this);
        recyclerView.setAdapter(adapter);
    }
}

У меня уже есть отдельный класс NotesAdapter:

   public class NotesAdapter extends RecyclerView.Adapter<NotesAdapter.MyViewHolder>
{

      protected List<Note> notesList;
      protected Context context;

public NotesAdapter(List<Note> notesList, Context context)
{
    this.notesList = notesList;
    this.context = context;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i)
{
    View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_row_layout, viewGroup, false);

    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i)
{
    Note note = notesList.get(i);
    myViewHolder.id.setText(note.getId());
    myViewHolder.title.setText(note.getTitle());
    myViewHolder.description.setText(note.getDescription());
}

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

public class MyViewHolder extends RecyclerView.ViewHolder
{
    public TextView title, description, id;

    public MyViewHolder(View view)
    {
        super(view);
        id = (TextView) view.findViewById(R.id.idTextView);
        title = (TextView) view.findViewById(R.id.titleTextView);
        description = (TextView) view.findViewById(R.id.descriptionTextView);

        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view)
            {
                Toast.makeText(context, "Clicked Row :" + getAdapterPosition(), Toast.LENGTH_LONG).show();

                Intent editNote = new Intent(context,EditNoteActivity.class);

                Bundle extras = new Bundle();
                context.startActivity(editNote);
            }
        });
    }
  }
}

Пожалуйста, помогите!Как правильно загрузить значения базы данных в просмотр списка утилит через массив, когда он изначально равен нулю.Также применяется правильный метод, описанный выше .?

Это основная область, где код работает неправильно:

 //ANR 
final List<Note> n = dbvalues.getAllNotes(); //retrieving values from DB
if (!n.isEmpty()) //error occurs since there are no notes in db
{
    for (int i = 0; i < n.size(); i++)
    {
        noteList.add(n.get(i));
    }
}

if(noteList.isEmpty())
{
    recyclerView.setAdapter(null);
}
else
{
    adapter = new NotesAdapter(noteList, this);
    recyclerView.setAdapter(adapter);
}
...