问题从“回收者视图”中删除条目

问题描述 投票:1回答:1

这个问题使我发疯。到目前为止,我已经尝试了20种不同的方法。因此,让我们看看这里是否有人可以帮助我。

我正在使用RecyclerView制作将数据存储在Firebase中的待办事项列表APP。

该应用程序具有TasksActivity,所有任务均出现在“回收站”视图中。我有一个转到“任务创建”对话框的按钮。我可以创建任务,然后将它们显示在“ Recycler”视图(“任务活动”)中,并在firebase中进行更新,没有任何问题。我可以关闭该APP并稍后再返回,并且一切正常,当我加载它时,所有条目都会再次出现在该应用中。我也可以滑动删除一个条目,并且该条目也会从firebase的数据库中删除。

问题是,当我创建一个任务而没有关闭应用程序时,我尝试删除刚创建的任务。它不允许我这样做。我创建后,它的insta再次出现。如果我随后关闭该应用程序并再次加载,则可以正常删除该条目,但是如果我处于创建该条目的同一会话中,则无法删除它。我正在使用一些Log.d参数来查看其变化。我认为出于各种原因,问题出在OnDataChange()上。但是到目前为止,我还没有找到问题的根源。这是TaskActivity类,在此之后,我将粘贴TasksCreation(我认为无需粘贴Adapter)

public class TasksActivity extends AppCompatActivity  {

DatabaseReference reference;
RecyclerView myTasks;
ArrayList<TaskItems> myTasksList;
TasksAdapter tasksAdapter;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tasks);
    myTasks = findViewById(R.id.my_tasks);   // RecyclerView that I defined as part of the layout. This is the id of it

    myTasks.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
    myTasksList = new ArrayList<>();
    Button openCreateTask = findViewById(R.id.openCreateTask);
    tasksAdapter = new TasksAdapter(this,myTasksList); 
    myTasks.setAdapter(tasksAdapter);
    new ItemTouchHelper(itemTouchHelper).attachToRecyclerView(myTasks);


    openCreateTask.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent_task = new Intent(getApplicationContext(), TasksCreation.class);
            startActivity(intent_task);
        }
    });


    reference = FirebaseDatabase.getInstance().getReference().child("MotApp"); // Name of the App in the database .child("MotApp")

    reference.addValueEventListener(new ValueEventListener() {


        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {   // It gets the info from the database
            Log.d("data Changed called", "onDataChange: is called");
            Log.d("whatever", "onDataChange BEGIN Array of myTasksList size is "+myTasksList.size());
            myTasksList.clear();                                            // Added later to avoid duplication




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


                TaskItems p = elements.getValue(TaskItems.class);
                myTasksList.add(p);

            }


            tasksAdapter.notifyDataSetChanged(); // If this is put outside of onDataChange, it displays a blank list.
            Log.d("whatever", "onDataChange END Array of myTasksList size is "+myTasksList.size());
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(getApplicationContext(), "No data", Toast.LENGTH_SHORT).show();
        }


    });

}



ItemTouchHelper.SimpleCallback itemTouchHelper = new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.RIGHT) {
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
        return false;
    }

    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        int position = viewHolder.getAdapterPosition();
        Log.d("ARRAY SIZE", "onSwiped BEGIN Array of myTasksList size is "+myTasksList.size());
        String key =    myTasksList.get(position).getKey();
        reference= FirebaseDatabase.getInstance().getReference().child("MotApp").child(key);


    Toast.makeText(getApplicationContext(),"This is key "+key,Toast.LENGTH_LONG).show();
     reference.removeValue();
    myTasksList.remove(position);
    tasksAdapter.notifyItemRemoved(position);

        Log.d("ARRAY SIZE", "onSwiped END Array of myTasksList size is "+myTasksList.size());




    }
};

这是用于TasksCreation

public class TasksCreation extends AppCompatActivity {



DatabaseReference referenceCreation;
ArrayList<String> list;
EditText taskName;
EditText taskDescr;
Button selectDates;
TextView taskDate;
Button createTask;
Button cancel;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tasks_creation);

    taskName = findViewById(R.id.et_TaskName);
    taskDescr = findViewById(R.id.et_TaskDescr);
    selectDates = findViewById(R.id.selectDates);
    taskDate= findViewById(R.id.tv_Dates);
    createTask = findViewById(R.id.createTask);
    cancel = findViewById(R.id.cancelButton);



    createTask.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if (!TextUtils.isEmpty(taskName.getText()) && !TextUtils.isEmpty(taskDate.getText())) {

                referenceCreation = FirebaseDatabase.getInstance().getReference().child("MotApp").push(); //saves it with custom key created by Firebase
                final String key = referenceCreation.getKey();

                referenceCreation.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {       
                        dataSnapshot.getRef().child("key").setValue(key);

                        dataSnapshot.getRef().child("taskTitle").setValue(taskName.getText().toString());
                        dataSnapshot.getRef().child("taskDescription").setValue(taskDescr.getText().toString());
                        dataSnapshot.getRef().child("taskDate").setValue(taskDate.getText().toString());



                    }


                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });


                Intent intent = new Intent(getApplicationContext(), TasksActivity.class);

                startActivity(intent);

            } else{
                Toast.makeText(getApplicationContext(), "You haven't filled all the fields", Toast.LENGTH_SHORT).show();
            }
        }
    });

cancel.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(getApplicationContext(), TasksActivity.class);

        startActivity(intent);
    }
});

selectDates.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        createAlertDialogue();
    }
});



}
private void createAlertDialogue(){
    list = new ArrayList<String>();

    AlertDialog.Builder builder = new AlertDialog.Builder(this,R.style.MyDialogTheme);


    builder.setTitle("Select days");
    builder.setMultiChoiceItems(R.array.Days, null, new DialogInterface.OnMultiChoiceClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which, boolean isChecked) {

            String arr[] = getResources().getStringArray(R.array.Days);

            if(isChecked){
                list.add(arr[which]);
            }else if(list.contains(arr[which])){
                list.remove(arr[which]);

            }

        }
    });

     builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {

        String data = "";
        @Override
        public void onClick(DialogInterface dialog, int which) {
        for(String elements: list){
            elements = elements.substring(0,3);
            data= elements+" "+data;

        }
            taskDate.setText(data);



        }
    });



    builder.create();

    builder.show();


}

}

我真的很感谢这个问题。

非常感谢

java android firebase firebase-realtime-database android-recyclerview
1个回答
0
投票
并且当您从onCreate()返回时,不会调用TasksCreate,因为当您从TasksActivity转移到TasksCreation时,TasksActivity不会被破坏,只是被停止,因此当您返回时至TasksActivity,它将开始并恢复;因此,将onCreate()上的代码传输到onResume(),以便使用最新更改来更新列表。

因此将您的TasksActivity更改为以下内容

public class TasksActivity extends AppCompatActivity { DatabaseReference reference; RecyclerView myTasks; ArrayList<TaskItems> myTasksList; TasksAdapter tasksAdapter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_tasks); } @Override protected void onResume() { super.onResume(); myTasks = findViewById(R.id.my_tasks); // RecyclerView that I defined as part of the layout. This is the id of it myTasks.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)); myTasksList = new ArrayList<>(); Button openCreateTask = findViewById(R.id.openCreateTask); tasksAdapter = new TasksAdapter(this,myTasksList); myTasks.setAdapter(tasksAdapter); new ItemTouchHelper(itemTouchHelper).attachToRecyclerView(myTasks); openCreateTask.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent_task = new Intent(getApplicationContext(), TasksCreation.class); startActivity(intent_task); } }); reference = FirebaseDatabase.getInstance().getReference().child("MotApp"); // Name of the App in the database .child("MotApp") reference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { // It gets the info from the database Log.d("data Changed called", "onDataChange: is called"); Log.d("whatever", "onDataChange BEGIN Array of myTasksList size is "+myTasksList.size()); myTasksList.clear(); // Added later to avoid duplication for(DataSnapshot elements: dataSnapshot.getChildren()){ TaskItems p = elements.getValue(TaskItems.class); myTasksList.add(p); } tasksAdapter.notifyDataSetChanged(); // If this is put outside of onDataChange, it displays a blank list. Log.d("whatever", "onDataChange END Array of myTasksList size is "+myTasksList.size()); } @Override public void onCancelled(@NonNull DatabaseError databaseError) { Toast.makeText(getApplicationContext(), "No data", Toast.LENGTH_SHORT).show(); } }); } ItemTouchHelper.SimpleCallback itemTouchHelper = new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.RIGHT) { @Override public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { return false; } @Override public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { int position = viewHolder.getAdapterPosition(); Log.d("ARRAY SIZE", "onSwiped BEGIN Array of myTasksList size is "+myTasksList.size()); String key = myTasksList.get(position).getKey(); reference= FirebaseDatabase.getInstance().getReference().child("MotApp").child(key); Toast.makeText(getApplicationContext(),"This is key "+key,Toast.LENGTH_LONG).show(); reference.removeValue(); myTasksList.remove(position); tasksAdapter.notifyItemRemoved(position); Log.d("ARRAY SIZE", "onSwiped END Array of myTasksList size is "+myTasksList.size()); } }; }

© www.soinside.com 2019 - 2024. All rights reserved.