Создание списка задач с помощью firebase, запутался, пытаясь понять логику

#android #firebase #android-recyclerview #google-cloud-firestore

#Android #firebase #android-recyclerview #google-облако-firestore

Вопрос:

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

 public class MainActivity extends AppCompatActivity {

    List<ToDo> toDoList = new ArrayList<>();
    FirebaseFirestore database;
//
    RecyclerView listItem;
    RecyclerView.LayoutManager layoutManager;

    FloatingActionButton fab;

    public MaterialEditText title,description;
    public boolean isUpdate = false;
    public String idUpdate = " ";

    ListItemAdapter adapter;
    SpotsDialog dialog;

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



        database = FirebaseFirestore.getInstance();

        //i think the issue is here
        listItem = (RecyclerView)findViewById(R.id.listTodo);
        listItem.setHasFixedSize(true);


        layoutManager = new LinearLayoutManager(this);
        listItem.setLayoutManager(layoutManager);





            @Override
            public void onClick(View view) {
                if(!isUpdate){
                    setData(title.getText().toString(), description.getText().toString());
                }
                else{
                    updateData(title.getText().toString(),description.getText().toString());
                    isUpdate = !isUpdate; //this resets it
                }
            }
        });

    }
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        if (item.getTitle().equals("DELETE"))
            deleteItem(item.getOrder());
        return super.onContextItemSelected(item);
    }





    private void loadData() {
        dialog.show();
        if (toDoList.size() > 0)
            toDoList.clear();
        database.collection("ToDoList")
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {

                        //end of oncomplete section added
                        for (DocumentSnapshot doc:task.getResult())
                        {
                            ToDo todo = new ToDo(doc.getString("id"),

                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Toast.makeText(MainActivity.this, "" e.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });
    }
}
  

activity_main.xml

 <?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:id="@ id/app_bar_layout"
        android:fitsSystemWindows="true"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:id="@ id/layout_info"
            android:orientation="vertical"
            android:padding="16dp"
            android:background="#1190CB"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">


            <com.rengwuxian.materialedittext.MaterialEditText
                android:id="@ id/title"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="text"
                android:text="Title"
                android:textColorHint="@android:color/white"
                android:textSize="30sp"
                app:met_baseColor="@android:color/white"
                app:met_floatingLabel="highlight"
                app:met_primaryColor="@android:color/white"
                app:met_singleLineEllipsis="true" />
            <!--add more for card items -->
            <com.rengwuxian.materialedittext.MaterialEditText
                android:id="@ id/description"
                android:text="Description"
                android:textSize="20sp"
                android:inputType="textMultiLine"
                android:textColorHint="@android:color/white"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:met_baseColor="@android:color/white"
                app:met_floatingLabel="highlight"
                app:met_primaryColor="@android:color/white"
                app:met_singleLineEllipsis="true"/>

        </LinearLayout>


    </android.support.design.widget.AppBarLayout>

    <android.support.design.widget.FloatingActionButton
        android:id="@ id/fab"
        android:src="@drawable/ic_add_black_24dp"
        android:layout_marginRight="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:elevation="6dp"
        app:pressedTranslationZ="12dp"
        app:layout_anchor="@id/app_bar_layout"
        app:layout_anchorGravity="bottom|right"
        app:fabSize="normal"/>


</android.support.design.widget.CoordinatorLayout>
  

Ответ №1:

В onCreate вашей деятельности попробуйте сначала инициализировать LayoutManager и только затем связать его с RecyclerView:

 layoutManager = new LinearLayoutManager(this);
listItem.setLayoutManager(layoutManager);
  

Другой вариант — объявить его в XML-файле:

    xmlns:app="http://schemas.android.com/apk/res-auto"

  <android.support.v7.widget.RecyclerView
    android:id="@ id/listTodo"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layoutManager="android.support.v7.widget.LinearLayoutManager" />
  

и тогда вам не придется ничего делать программно.

Обновление из комментария:

Ваше приложение выходит из строя NullPointerException из-за того, что вы не инициируете todoList его в конструкторе вашего адаптера, поэтому getItemCount() он вызывается, когда ваш список равен null.

Добавьте проверку в этот метод в классе адаптера:

 @Override
public int getItemCount() {
    if (todoList != null)
        return todoList.size();
    return 0;
}
  

Комментарии:

1. Я добавил оба в приложение, и оно перестало зависать при открытии, однако при нажатии кнопки fab оно затем вылетает с ошибкой; java.lang. Исключение NullPointerException: попытка вызвать метод интерфейса ‘int java.util.List.size()’ для нулевой ссылки на объект в e.marc.managementapplication. Адаптер. ListItemAdapter.getItemCount(ListItemAdapter.java:101)

2. Это потому, что вы не инициируете todoList в конструкторе вашего адаптера! итак getItemCount() , вызывается, когда ваш список равен нулю

3. Привет, извините, не могли бы вы сказать мне, где это написать в коде, пожалуйста?

4. Привет, это остановило его сбой, но я все еще получаю E / RecyclerView: менеджер макетов не прикреплен; пропустив макет, я обновил свой код mainactivity и добавил XML-файл. надеюсь, это поможет найти проблему! также большое спасибо за вашу помощь уже

5. Правильно ли recyclerview заполняется элементами?

Ответ №2:

Вам не хватает настройки layout manager для вашего представления recycler. Вы прокомментировали его создание

 listItem.setLayoutManager(manager);
  

Комментарии:

1. Привет, спасибо за ваш ответ, где примерно я должен вставить это?

2. Просто раскомментируйте строку // layoutManager = new LinearLayoutManager(this); MainActivity перед ListViewAdapter и удалите строку ниже listItem.setLayoutManager(manager);

3. Привет, я изменил его так, чтобы он выглядел следующим образом LayoutManager = новый LinearLayoutManager(this); адаптер = новый ListItemAdapter(MainActivity.this,ToDoList); ListItem.setAdapter(адаптер); ListItem.setLayoutManager (LayoutManager); // LayoutManager = новый LinearLayoutManager (this); но я все равно получаютот же код ошибки, что и выше

Ответ №3:

удалите loadData() внутри loadData() .

Комментарии:

1. Теперь это остановило сбой кнопки fab, но по-прежнему пропущен recylerview, вот ошибки; 2019-04-11 07:30:15.430 17533-17543/? E / mentapplicatio: Не удалось отправить пакет DDMS REAQ в отладчик (-1 из 20): Неработающий канал 2019-04-11 07:30:17.950 17533-17533 / e.marc.managementapplication E / RecyclerView: адаптер не подключен; пропуск макета

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

3. удалите import e.marc.managementapplication.R; в adapter и проверьте имя вашего пакета.

Ответ №4:

Попробуйте настроить менеджер компоновки таким образом.

 
        listItem = (RecyclerView)findViewById(R.id.listTodo);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
        listItem.setLayoutManager(layoutManager);
        listItem.setHasFixedSize(true);

  

Попробуйте использовать представление firebase recycler, Поможет вам управлять новыми элементами, обновлениями и т. Д.

https://github.com/firebase/FirebaseUI-Android