【问题标题】:How do I update the listview after I delete an item?删除项目后如何更新列表视图?
【发布时间】:2019-08-28 01:42:05
【问题描述】:

每次我从列表视图中的 firebase 中删除数据时,我都会可视化数据拆分并且不正确。 我已经有了适配器,但我无法处理它。 在这段代码中,我看到了 firebase 上的列表视图,当我单击数据项时,我询问用户是否要删除数据。 我该怎么办?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    firebaseAuth = FirebaseAuth.getInstance();
    firebaseUser = firebaseAuth.getCurrentUser();
    setContentView(R.layout.activity_elenco);

    storage = FirebaseStorage.getInstance();
    //storageReference = storage.getReference();
    listView = findViewById(R.id.listView);
    databaseReference = FirebaseDatabase.getInstance().getReference("Users");

    usersList = new ArrayList<>();


}

@Override
protected void onStart() {
    super.onStart();
    Query query = databaseReference.orderByChild("id").equalTo(firebaseUser.getUid());

    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot usersSnapshot:dataSnapshot.getChildren()){
                Users users = usersSnapshot.getValue(Users.class);
                usersList.add(users);
                keyList.add(usersSnapshot.getKey());
            }
            UserAdapter userAdapter = new UserAdapter(Elenco.this,usersList);
            listView.setAdapter(userAdapter);

        }

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

        }
    });

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        final CharSequence[] items = {"SI","NO"};
        AlertDialog.Builder builder = new AlertDialog.Builder(Elenco.this);
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            builder.setTitle("Vuoi eliminare la segnalazione?");
            builder.setItems(items, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int i) {
                    if(items[i]=="SI"){
                        StorageReference photoRef = storage.getReferenceFromUrl("gs://tesi-779f2.appspot.com/"+keyList.get(position));
                        photoRef.delete();
                        usersList.remove(position);
                        databaseReference.getRoot().child("Users").child(keyList.get(position)).removeValue();
                        keyList.remove(position);
                        startActivity(new Intent(Elenco.this,Profilo.class));
                    }else if(items[i]=="NO"){
                        dialog.dismiss();
                    }

                }
            });
            builder.show();

        }
    });
}
}

【问题讨论】:

    标签: android android-layout listview android-adapter


    【解决方案1】:

    用户适配器用户适配器。通过 onCreate 方法将此变量设为全局变量。

    在onItemClick事件之后

    keyList.remove(position);
    startActivity(new Intent(Elenco.this,Profilo.class));
    

    写在下面一行。

    userAdapter.notifyDataSetChanged();
    

    这将更新您的列表视图。

    【讨论】:

    • 给出此错误:java.lang.RuntimeException:无法实例化活动 ComponentInfo{com.example.registrazioneapp/com.example.registrazioneapp.Elenco}:java.lang.IllegalStateException:系统服务不可用于onCreate() 之前的活动
    • 你能在这里发布你的完整代码吗?所以我会帮助你
    • 我求解器!把 usersList.clear();在 onDataChange 方法中。
    【解决方案2】:

    像这样在适配器类中定义一个方法

    public void refresh(List<Users> userList){
            this.userList=userList;
            notifyDataSetChanged();
        }
    

    并在您进行更改时调用此方法。

    【讨论】:

      【解决方案3】:

      您需要通过以下方式从列表视图的适配器中删除数据 adapter.remove(adapter.getItem(position));

      然后在适配器上调用notifyDataSetChanged()

      【讨论】:

      • 请编辑帖子并告诉我在哪里输入代码,否则我不明白。
      • 检查更改
      • 不起作用。我把 notifyDataSetChanged();但给我红色错误
      • 我求解器!把 usersList.clear();在 onDataChange 方法中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多