Как показать текстовое представление / макет вместо пустого повторного просмотра? - PullRequest
0 голосов
/ 18 января 2020

Я создал фитнес-приложение, в котором пользователь может сохранить его / ее activity и просмотреть его в recycleview. Это прекрасно работает, но когда нет данных, app crashes, когда я пытаюсь получить доступ к recycleview layout.

Мне нужно показать текстовое представление ("История пуста") вместо пустого recycleview.

Вот часть моего xml recycleview макета. Обратите внимание, что это относительный макет:

<ImageView
    android:id="@+id/mainbackground"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/HistoryTab"
    android:layout_alignParentTop="true"
    android:layout_alignParentEnd="true"
    android:layout_marginTop="2dp"
    android:layout_marginEnd="-203dp"
    android:scaleType="centerCrop"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:srcCompat="@drawable/road_run"
    tools:ignore="contentDescription" />

<ImageView
    android:id="@+id/overlay"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@id/bottom_banner"
    android:layout_below="@id/HistoryTab"
    android:background="@drawable/run_interface_background" />


<androidx.recyclerview.widget.RecyclerView

    android:id="@+id/Recycle_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@id/bottom_banner"
    android:layout_below="@id/HistoryTab" />


<TextView
    android:id="@+id/EmptyActivity"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:text="Your History Is Empty"
    android:textColor="#ffff"
    android:textSize="16dp" />

Как вы видите, если повторное представление пусто, текстовое представление EmptyActivity должно быть видно ... ТОЛЬКО когда данных нет.

Recyclview

Ниже приведен код, который показывает, где и почему приложение:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recycler_view_layout);
        recyclerView = (RecyclerView) findViewById(R.id.Recycle_layout);
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setHasFixedSize(true);
        RunoraDatabaseHelper runoraDatabaseHelper = new RunoraDatabaseHelper(this);
        SQLiteDatabase sqLiteDatabase = runoraDatabaseHelper.getReadableDatabase();

        Cursor cursor = runoraDatabaseHelper.RetrieveDataFromDatabase(sqLiteDatabase);

        cursor.moveToFirst();
        do {
            RetrieveRunnerActivity retrieveRunnerActivity = new RetrieveRunnerActivity(cursor.getString(1), cursor.getString(2), (cursor.getString(3)));
            arrayList.add(retrieveRunnerActivity);
        } while (cursor.moveToNext());
        runoraDatabaseHelper.close();

        adapter = new RecycleAdapter(arrayList);
        recyclerView.setAdapter(adapter);

        returnButton = (Button) findViewById(R.id.returnButton);
        history_btn = (Button) findViewById(R.id.history_btn);


        returnButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(DisplayHistory.this, home.class);
                startActivity(intent);
            }
        });

        history_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(DisplayHistory.this, settings.class);
                startActivity(intent);
            }
        });
  Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

Строка, в которой происходит сбой приложения:

  RetrieveRunnerActivity retrieveRunnerActivity = new RetrieveRunnerActivity(cursor.getString(1), cursor.getString(2), (cursor.getString(3)));

As вы можете видеть, что, когда никакие данные не были сохранены, а база данных не возвращает никаких данных, приложение щелкает, когда я нажимаю, чтобы получить доступ к макету, содержащему повторный просмотр.

Пожалуйста, помогите. Я бьюсь головой об этом, и Я пробовал ответы, которые видел на stackoverflow, но все еще не добился успеха.

Если кто-то потребует, чтобы я опубликовал больше действий (recycleadapater, databasehelper, класс RetrieveRunnerActivity и т. Д. c) Пожалуйста, дайте мне знать.

Я несколько раз редактировал свой код, но я не получить желаемый результат. Приведенный ниже код позволяет мне получить доступ к моей операции повторного просмотра, когда в моей базе данных нет сохраненных данных для извлечения, но теперь я могу отображать текстовое представление вместо пустого повторного просмотра, но в то же время все кнопки в этом макете перестают работать.

Когда у меня есть данные, доступные для извлечения, recyclew_layout не показывает извлеченные данные / элементы, и все кнопки этого действия все еще не работают.

      if (cursor.getCount() > 0) {
        RetrieveRunnerActivity retrieveRunnerActivity = new RetrieveRunnerActivity(cursor.getString(1), cursor.getString(2), (cursor.getString(3)));
        arrayList.add(retrieveRunnerActivity);
        EmptyActivity.setVisibility(View.GONE);
    } else {
        if (cursor.getCount() <= 0) {
            recycleLayout.setVisibility(View.GONE);
            EmptyActivity.setVisibility(View.VISIBLE);
        }
        while (cursor.moveToNext()) {
            runoraDatabaseHelper.close();

Ответы [ 2 ]

0 голосов
/ 18 января 2020

Вот ответ на мою проблему:

       if (cursor.moveToFirst()) {
        do {
            RetrieveRunnerActivity retrieveRunnerActivity = new RetrieveRunnerActivity(cursor.getString(1), cursor.getString(2), (cursor.getString(3)));
            arrayList.add(retrieveRunnerActivity);
            adapter = new RecycleAdapter(arrayList);
            recyclerView.setAdapter(adapter);
            EmptyActivity.setVisibility(View.INVISIBLE);
        }
        while
              (cursor.moveToNext());

    } else
        EmptyActivity.setVisibility(View.VISIBLE);

Первоначальный cra sh был на самом деле вызван этим:

 while (cursor.moveToNext()) {
            runoraDatabaseHelper.close();

Надеюсь, это поможет кому-то, если они когда-либо попадут в это беда.

0 голосов
/ 18 января 2020

ошибка показывает, что ваш Cursor объект имеет 0 записей, и вы пытаетесь прочитать, вызывая индекс этого пустого объекта.

Перед использованием Cursor объект проверьте счетчик с помощью: Cursor.getCount ()

возвращает счетчик курсоров как переменную типа int. если в вашем Курсоре есть записи, то заполните свое окно просмотра, иначе вы можете показать EmptyActivity текстовое представление, которое есть в вашем xml.

...