I am trying to adding task in this todo app, it works fine but not showing todo items while items are showing on cloud filestore but not in app.
Here are my Main and ListItemAdapter. It shows the error of skipping layout. I used firebase cloud file for saving my list on int.
Main Activity
public class MainActivity extends AppCompatActivity {
List<ToDo> toDoList = new ArrayList<>();
FirebaseFirestore db;
RecyclerView listItem;
RecyclerView.LayoutManager layoutManager;
FloatingActionButton fab;
public MaterialEditText title, description;
public boolean isUpdate = false;
public String idUpdate = "" ;
ListItemAdapter adapter;
AlertDialog dialog ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listItem = (RecyclerView)findViewById(R.id.listTodo);
listItem.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(this);
listItem.setLayoutManager(layoutManager);
db = FirebaseFirestore.getInstance(); //init firebase
dialog = new SpotsDialog(MainActivity.this);
title = (MaterialEditText)findViewById(R.id.title);
description = (MaterialEditText)findViewById(R.id.description);
fab = (FloatingActionButton)findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!isUpdate){
setData(title.getText().toString(),description.getText().toString());
}
else
{
updateData(title.getText().toString(),description.getText().toString());
isUpdate = !isUpdate; //reset flag
}
}
});
//recycler view
loadData();
}
@Override
public boolean onContextItemSelected(MenuItem item) {
if(item.getTitle().equals("DELETE"))
deleteItem(item.getOrder());
return super.onContextItemSelected(item);
}
private void deleteItem(int index) {
db.collection("ToDoList")
.document(toDoList.get(index).getId())
.delete()
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
loadData();
}
});
}
private void updateData(String title, String description) {
db.collection("ToDoList").document(idUpdate)
.update("title",title,"description",description)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(MainActivity.this,"Updated !",Toast.LENGTH_SHORT).show();
}
});
//Realtime update refresh data
db.collection("ToDoList").document(idUpdate)
.addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(DocumentSnapshot documentSnapshot, FirebaseFirestoreException e) {
loadData();
}
});
}
private void setData(String title, String description) {
String id = UUID.randomUUID().toString();
Map<String,Object> todo = new HashMap<>();
todo.put("id",id);
todo.put("title",title);
todo.put("description",description);
db.collection("ToDoList").document(id).set(todo).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
loadData(); //refresh data
}
});
}
private void loadData() {
dialog.show();
if(toDoList.size() > 0 )
toDoList.clear(); //remove old value
db.collection("ToDo List")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
for (DocumentSnapshot doc:task.getResult())
{
ToDo todo = new ToDo(doc.getString("id"),
doc.getString("title"),
doc.getString("description"));
toDoList.add(todo);
}
adapter = new ListItemAdapter(MainActivity.this,toDoList);
listItem.setAdapter(adapter);
dialog.dismiss();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(MainActivity.this,"" +e.getMessage(),Toast.LENGTH_SHORT).show();
}
});
}
}
ListItemAdapter
class ListItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,View.OnCreateContextMenuListener
{
ItemClickListener itemClickListener;
TextView item_title, item_description;
public ListItemViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
itemView.setOnCreateContextMenuListener(this);
item_title = (TextView)itemView.findViewById(R.id.item_title);
item_description = (TextView)itemView.findViewById(R.id.item_description);
}
public void setItemClickListener(ItemClickListener itemClickListener) {
this.itemClickListener = itemClickListener;
}
@Override
public void onClick(View v) {
itemClickListener.onClick(v,getAdapterPosition(),false);
}
@Override
public void onCreateContextMenu(ContextMenu contextMenu, View v, ContextMenu.ContextMenuInfo contextMenuInfo) {
contextMenu.setHeaderTitle("Select the action");
contextMenu.add(0,0,getAdapterPosition(),"DELETE");
}
}
public class ListItemAdapter extends RecyclerView.Adapter<ListItemViewHolder> {
MainActivity mainActivity;
List<ToDo> todoList;
public ListItemAdapter(MainActivity mainActivity, List<ToDo> todoList) {
this.mainActivity = mainActivity;
this.todoList = todoList;
}
@Override
public ListItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(mainActivity.getBaseContext());
View view = inflater.inflate(R.layout.list_item,parent,false);
return new ListItemViewHolder(view);
}
@Override
public void onBindViewHolder(ListItemViewHolder holder, int position) {
// set data for item
holder.item_title.setText(todoList.get(position).getTitle());
holder.item_description.setText(todoList.get(position).getDescription());
holder.setItemClickListener(new ItemClickListener() {
@Override
public void onClick(View view, int position, boolean isLongClick) {
//When user select item data will auto set for Edit Text
mainActivity.title.setText(todoList.get(position).getTitle());
mainActivity.description.setText(todoList.get(position).getDescription());
mainActivity.isUpdate = true; //set flag update is true
mainActivity.idUpdate = todoList.get(position).getId();
}
});
}
@Override
public int getItemCount() {
return todoList.size();
}
}
Error Trace
E/RecyclerView: No adapter attached; skipping layout
W/View: dispatchProvideAutofillStructure(): not laid out, ignoring