0

I have created todoapp which adds task in RecyclerView and also delete it. The is problem, I want to edit single task at a time if I tap any one of the task in a list by using AlertDialog. I also want to update the edit task in firebase database.

MainActivity.java

private RecyclerView mRecyclerView;
private LinearLayoutManager mLinearLayoutManager;
private RecyclerViewAdapter mRecyclerAdapter;
private EditText mTaskEditText;
private DatabaseReference databaseReference;

private List<Task> listOfTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    //Array list of all tasks
    listOfTask = new ArrayList<>();
    //get the database reference of FIREBASE
    databaseReference = FirebaseDatabase.getInstance().getReference();
    //this is where you can enter text of your task
    mTaskEditText = (EditText) findViewById(R.id.add_task_box);

    //Initializing RecyclerView
    mRecyclerView = (RecyclerView) findViewById(R.id.task_list);
    //As we are showing data in Linear form we are using this
    mLinearLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLinearLayoutManager);

    //When we add text of task, and press Button "Add task" triggers this
    Button addTaskButton = (Button) findViewById(R.id.add_task_button);

    assert addTaskButton != null;
    addTaskButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String enteredTask = mTaskEditText.getText().toString();
            if(TextUtils.isEmpty(enteredTask)){
                Toast.makeText(MainActivity.this, "You must enter a task to Add it",Toast.LENGTH_LONG).show();
                return;
            }
            else{
                //If task text is valid Add it in our FIREBASE DATABASE.
                Task taskObject = new Task(enteredTask);

                databaseReference.push().setValue(taskObject);
                mTaskEditText.setText("");
            }

        }
    });


    //Database helper methods
    databaseReference.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            //if added , show all
            getAllTask(dataSnapshot);
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            //if changed show all
            getAllTask(dataSnapshot);
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            //delete the task
            taskDeletion(dataSnapshot);
        }
        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

//On delete, remove the task from Firebase database - REAL TIME
private void taskDeletion(DataSnapshot dataSnapshot) {

    for (DataSnapshot singleDataSnapshot : dataSnapshot.getChildren()) {

        String currentTask = singleDataSnapshot.getValue(String.class);
        for (int i = 0; i < listOfTask.size(); i++) {
            if (listOfTask.get(i).getTask().equals(currentTask)) {
                listOfTask.remove(i);
            }


        }

        //After removing , send notification to RecyclerView to remove the element
        // AND re adapt it
        mRecyclerAdapter.notifyDataSetChanged();
        mRecyclerAdapter = new RecyclerViewAdapter(MainActivity.this, listOfTask);
        mRecyclerView.setAdapter(mRecyclerAdapter);

    }
}

private void getAllTask(DataSnapshot dataSnapshot) {

    //get all task when opening the app.
    for(DataSnapshot singleShot : dataSnapshot.getChildren()){
        String taskTitle = singleShot.getValue(String.class);
        listOfTask.add(new Task(taskTitle));
        mRecyclerAdapter = new RecyclerViewAdapter(MainActivity.this,listOfTask);
        mRecyclerView.setAdapter(mRecyclerAdapter);
    }

}}

RecyclerViewAdapter.java

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolders> {

    private List<Task> tasks;
    protected Context context;

    public RecyclerViewAdapter(Context context, List<Task> allTask){
         this.tasks = allTask;
         this.context = context;
    }

    @Override
    public RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerViewHolders viewHolders = null;
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.to_do_list, parent,false);
        viewHolders = new RecyclerViewHolders(view,tasks);
        return viewHolders;
    }

    @Override
    public void onBindViewHolder(RecyclerViewHolders holder, int position) {
        holder.categoryTitle.setText(tasks.get(position).getTask());
    }

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

RecyclerViewHolder

public class RecyclerViewHolders extends RecyclerView.ViewHolder {

private static final String TAG = RecyclerViewHolders.class.getSimpleName();
public ImageView markIcon;
public TextView categoryTitle;
public ImageView deleteIcon;
private List<Task> taskObject;

public RecyclerViewHolders(View itemView, final List<Task> taskObject) {
    super(itemView);

    this.taskObject = taskObject;
    categoryTitle = (TextView) itemView.findViewById(R.id.task_title);
    markIcon = (ImageView) itemView.findViewById(R.id.task_icon);
    deleteIcon = (ImageView) itemView.findViewById(R.id.task_delete);
    deleteIcon.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            String taskTitle = taskObject.get(getAdapterPosition()).getTask();
            DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
            Query deletequery = reference.orderByChild("task").equalTo(taskTitle);
            deletequery.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot appleSnapshot: dataSnapshot.getChildren()) {
                        appleSnapshot.getRef().removeValue();

                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    Log.e(TAG, "Cancelled Exception", databaseError.toException());
                }
            });
        }
    });
}}

Task.java

public class Task {
private String task;

    public Task() {
    }

    public Task(String task) {
         this.task = task;
    }

    public String getTask() {
         return task;
    }
}
Dennis van Opstal
  • 1,294
  • 1
  • 22
  • 44
M. Umer
  • 11
  • 5
  • 1
    You can add an onClickListener for each item in the recyclerview. In that method, you can update the Database. Also, it doesn't look like you have a taskID stored anywhere. It will make things much easier if you store each task in the database with a unique id. onClickListener help: https://stackoverflow.com/questions/24471109/recyclerview-onclick – Tristan Feb 14 '18 at 17:58
  • there is a still problem. I want to pop up **AlertDialog** in which user can edit that task and also changes saved in app and also **FireBase**. Kindly help me. – M. Umer Feb 16 '18 at 16:14
  • From my understanding, AlertDialog is used only for confirmations. You will want to use the Dialog class instead. How to implement it is too broad for SO. I suggest you google examples. Dialog Docs: https://developer.android.com/reference/android/app/Dialog.html SO help on implementing Dialogs: https://stackoverflow.com/questions/2115758/how-do-i-display-an-alert-dialog-on-android – Tristan Feb 16 '18 at 16:25
  • does not find any solution, still confusing!!! – M. Umer Feb 20 '18 at 15:03

0 Answers0