在 Android 中更新 firebase 数据库时,ListView 值复制该值
ListView Value duplicating the value when the firebase database is updated in Android
我在 Fragment
中有 Listview
,我在其中使用 ArrayAdapter
设置数据,当我使用对话框删除数据时,值在 listview
.我不知道该怎么做 我想在对话框中单击删除按钮时刷新我的 fragment
但我不知道该怎么做 that.I 我是 Android 的新手 请让我知道我能做些什么来解决 this.Here 是我的代码。
ListOfFaculty
public class ListOfFaculty extends Fragment {
DatabaseReference ref;
ListView listview;
List<String> store;
List<String> UserID;
String[] faculty_list;
String a;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ref = FirebaseDatabase.getInstance().getReference("Faculty");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
final View root = inflater.inflate(R.layout.fragment_list_of_faculty, container, false);
listview = root.findViewById(R.id.lv);
store =new ArrayList<>();
UserID =new ArrayList<>();
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot postsap : dataSnapshot.getChildren() ) {
DataSnapshot data = postsap.child("name");
if(data.exists()){
a = data.getValue().toString();
}
store.add(a);
String Id = postsap.getKey();
UserID.add(Id);
}
faculty_list = new String[store.size()];
for(int i=0;i<faculty_list.length;i++){
faculty_list[i] =store.get(i);
}
if (getActivity() != null) {
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item, faculty_list);
listview.setAdapter(adapter);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent i = new Intent(getContext(),Faculty.class);
i.putExtra("User_Id",UserID.get(position));
startActivity(i);
}
});
listview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
String name = faculty_list[position];
Toast.makeText(getContext(), ""+UserID.get(position), Toast.LENGTH_SHORT).show();
DialogFragment dialogFragment =new MyDailogFragment();
Bundle bundle =new Bundle();
bundle.putString("Name",name);
bundle.putString("Id",UserID.get(position));
dialogFragment.setArguments(bundle);
dialogFragment.show(getChildFragmentManager(),"missiles");
return true;
}
});
return root;
}
}
这是我的对话框代码,我用 ListofFaculty fragment
.
中的 .setOnItemLongClickListener
调用这个 Dialog
框
MyDailogFragment
public class MyDailogFragment extends DialogFragment {
DatabaseReference dailog;
String Id;
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
Bundle bundle = getArguments();
final String name= bundle.getString("Name","");
Id = bundle.getString("Id","");
AlertDialog.Builder alertDialog = new AlertDialog.Builder(getActivity());
alertDialog.setMessage("Delete "+name+ " ?")
.setPositiveButton("Delete", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getActivity(), ""+Id, Toast.LENGTH_SHORT).show();
dailog = FirebaseDatabase.getInstance().getReference("Faculty").child(Id);
dailog.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
dataSnapshot.getRef().removeValue();
Toast.makeText(getActivity(), name+" Deleted Successfully ", Toast.LENGTH_SHORT).show();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getActivity(), "Nothing", Toast.LENGTH_SHORT).show();
}
});
return alertDialog.create();
}
}
有新值时必须清除旧数据
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
store.clear();
for(DataSnapshot postsap : dataSnapshot.getChildren() ){
DataSnapshot data = postsap.child("name");
if(data.exists()){
a = data.getValue().toString();
}
store.add(a);
String Id = postsap.getKey();
UserID.add(Id);
}
faculty_list = new String[store.size()];
for(int i=0;i<faculty_list.length;i++){
faculty_list[i] =store.get(i);
}
if (getActivity() != null) {
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item, faculty_list);
listview.setAdapter(adapter);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
我在 Fragment
中有 Listview
,我在其中使用 ArrayAdapter
设置数据,当我使用对话框删除数据时,值在 listview
.我不知道该怎么做 我想在对话框中单击删除按钮时刷新我的 fragment
但我不知道该怎么做 that.I 我是 Android 的新手 请让我知道我能做些什么来解决 this.Here 是我的代码。
ListOfFaculty
public class ListOfFaculty extends Fragment {
DatabaseReference ref;
ListView listview;
List<String> store;
List<String> UserID;
String[] faculty_list;
String a;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ref = FirebaseDatabase.getInstance().getReference("Faculty");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
final View root = inflater.inflate(R.layout.fragment_list_of_faculty, container, false);
listview = root.findViewById(R.id.lv);
store =new ArrayList<>();
UserID =new ArrayList<>();
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot postsap : dataSnapshot.getChildren() ) {
DataSnapshot data = postsap.child("name");
if(data.exists()){
a = data.getValue().toString();
}
store.add(a);
String Id = postsap.getKey();
UserID.add(Id);
}
faculty_list = new String[store.size()];
for(int i=0;i<faculty_list.length;i++){
faculty_list[i] =store.get(i);
}
if (getActivity() != null) {
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item, faculty_list);
listview.setAdapter(adapter);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent i = new Intent(getContext(),Faculty.class);
i.putExtra("User_Id",UserID.get(position));
startActivity(i);
}
});
listview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
String name = faculty_list[position];
Toast.makeText(getContext(), ""+UserID.get(position), Toast.LENGTH_SHORT).show();
DialogFragment dialogFragment =new MyDailogFragment();
Bundle bundle =new Bundle();
bundle.putString("Name",name);
bundle.putString("Id",UserID.get(position));
dialogFragment.setArguments(bundle);
dialogFragment.show(getChildFragmentManager(),"missiles");
return true;
}
});
return root;
}
}
这是我的对话框代码,我用 ListofFaculty fragment
.
setOnItemLongClickListener
调用这个 Dialog
框
MyDailogFragment
public class MyDailogFragment extends DialogFragment {
DatabaseReference dailog;
String Id;
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
Bundle bundle = getArguments();
final String name= bundle.getString("Name","");
Id = bundle.getString("Id","");
AlertDialog.Builder alertDialog = new AlertDialog.Builder(getActivity());
alertDialog.setMessage("Delete "+name+ " ?")
.setPositiveButton("Delete", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getActivity(), ""+Id, Toast.LENGTH_SHORT).show();
dailog = FirebaseDatabase.getInstance().getReference("Faculty").child(Id);
dailog.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
dataSnapshot.getRef().removeValue();
Toast.makeText(getActivity(), name+" Deleted Successfully ", Toast.LENGTH_SHORT).show();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getActivity(), "Nothing", Toast.LENGTH_SHORT).show();
}
});
return alertDialog.create();
}
}
有新值时必须清除旧数据
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
store.clear();
for(DataSnapshot postsap : dataSnapshot.getChildren() ){
DataSnapshot data = postsap.child("name");
if(data.exists()){
a = data.getValue().toString();
}
store.add(a);
String Id = postsap.getKey();
UserID.add(Id);
}
faculty_list = new String[store.size()];
for(int i=0;i<faculty_list.length;i++){
faculty_list[i] =store.get(i);
}
if (getActivity() != null) {
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item, faculty_list);
listview.setAdapter(adapter);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});