#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, Поможет вам управлять новыми элементами, обновлениями и т. Д.