2017-12-08 9 views
0

Mein Listenansichtselement enthält eine Schaltfläche zum Entfernen, und ich habe es in meinem Adapter eingerichtet, um das Objekt aus der Datenbank zu entfernen. Nun, wenn das erledigt ist, wie kann ich das Fragment aktualisieren, das die ListView enthält, um dieses Objekt zu entfernen? Relevante Code wie folgt:ListView löscht immer das letzte Objekt

entfernen Artikel im Adapter:

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

      AlertDialog alertDialog = new AlertDialog.Builder(mContext).create(); 
      alertDialog.setTitle("Delete item"); 
      alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "yes", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 

          FirebaseMethods firebaseMethods = new FirebaseMethods(mContext); 
          firebaseMethods.deleteHashtagFromDatabase(title); 

          dialog.dismiss(); 
         } 
        }); 
      alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "no", 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          dialog.dismiss(); 
         } 
        }); 


        alertDialog.show(); 


     } 
    }); 

Listview ist Setup wie dies in meinem Fragment:

private void setupListView(){ 

    Log.d(TAG, "setupListView: setting up list"); 
    final ArrayList<HashTag> hashTags = new ArrayList<>(); 
    myRef = FirebaseDatabase.getInstance().getReference(); 
    Query query = myRef.child(getString(R.string.dbname_user_hashtags)) 
      .child(FirebaseAuth.getInstance().getCurrentUser().getUid()); 
    query.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){ 


       if(singleSnapshot != null){ 
        hashTags.add(0, singleSnapshot.getValue(HashTag.class)); 
       } 

      } 

      HashTagListViewAdapter adapter = new HashTagListViewAdapter(getActivity(), R.layout.layout_list_itemview, hashTags); 
      hashtagListView.setAdapter(adapter); 



     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

Dank!

UPDATE:

Jetzt habe ich die OnClickListener auf den Unterpunkt aus dem Adapter an das Fragment Listview OnItemClickListener bestanden wie folgt:

aktualisiert Adapter

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

      ((ListView) parent).performItemClick(v, position, 0); 



     } 
    }); 

Aktualisiert Fragment

hashtagListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, final int position, long id) { 


      long viewId = view.getId(); 
      Log.d(TAG, "onItemClick: viewId is " + viewId); 
      Log.d(TAG, "onItemClick: position is " + position); 

      final HashTagListViewAdapter adapter = new HashTagListViewAdapter(getActivity(), R.layout.layout_list_itemview, hashTags); 
      final HashTag hashTag = hashTags.get(position); 
      final String title = hashTag.getTitle(); 
      Log.d(TAG, "onItemClick: title is " + title); 


      if(viewId == R.id.deleteFromListBtn){ 

       AlertDialog alertDialog = new AlertDialog.Builder(getActivity()).create(); 
       alertDialog.setTitle("delete item"); 
       alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "yes", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int which) { 

           FirebaseMethods firebaseMethods = new FirebaseMethods(getActivity()); 
           firebaseMethods.deleteHashtagFromDatabase(title); 
           Log.d(TAG, "onClick: title is " + title); 

           // NEW PROBLEM HERE! 
           adapter.remove(hashTag); 
           Log.d(TAG, "onClick: removed hashtag is " + hashTag); 
           adapter.notifyDataSetChanged(); 

           Log.d(TAG, "onItemClick: item removed from list."); 

           dialog.dismiss(); 
          } 
         }); 
       alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "no", 
         new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 
           dialog.dismiss(); 
          } 
         }); 


       alertDialog.show(); 


      } 
     } 
    }); 

Aber jetzt ist das Problem, wenn ich das Element löschen, löscht das ListView immer das letzte Element in der Ansicht. Der richtige Artikel wurde jedoch aus der Datenbank gelöscht, und gemäß dem Protokoll greift dieser Code adapter.remove(hashTag) das richtige Element, das ich löschen möchte.

Antwort

0

Zunächst sollten Sie nicht die ganze Fragment aktualisieren. Unsitte

So aktualisieren Sie Ihre ListView,

  1. Zuerst das Element aus ArrayList (mit dem Namen 'Hashtags') entfernen.
  2. Und rufen Sie einfach YOUR_ADAPTER.notifyDataSetChanged().

notifyDataSetChanged() automatisch Element aus den ListView entfernen.

Use of notifyDataSetChanged()

+0

die Sache ist, muss ich die Aktion remove in OnClickListener des Adapters für einen Unterpunkt der Listenansicht definieren. Daher wurde OnClickListener nicht im ListView ItemOnClickListener im Fragment festgelegt.Ich habe diesen Teil behoben, aber ein neues Problem taucht auf. Bitte sehen Sie meine Bearbeitung. Vielen Dank! – user8795747

0

Sie sollen zuerst das Element aus der Datenbank entfernen, und wenn aus der Datenbank kommt Erfolg dann Element sollte von Arraylist und der Adapter sollte über die Veränderungen seines notifiy im ArratList gemacht entfernt werden.

So entfernen Sie ein Element aus der ArrayList-Formularadapterklasse.

//postion is the location of item in the arraylist to be deleted. 
dataSet.remove(position); 

jetzt den Adapter über die Änderungen in der ArrayList zu benachrichtigen. und es sollte die Adapterklasse aufgerufen werden.

+0

die Sache ist, ich muss die Aktion remove in OnClickListener des Adapters für einen Unterpunkt der Listenansicht definieren. Daher wurde OnClickListener nicht im ListView ItemOnClickListener im Fragment festgelegt. Ich habe diesen Teil behoben, aber ein neues Problem taucht auf. Bitte sehen Sie meine Bearbeitung. Vielen Dank! – user8795747

+0

adapter.remove (hashTags.get (position)); Probieren Sie es aus, kann der HashTag die Referenz des letzten Elements speichern. –

+0

hey, danke für das Update. Ich habe das Problem gelöst, indem ich den Adapter nach der Löschaktion erneut gesetzt habe. 'hashtagListView.setAdapter (adapter);' Hat die Idee von einer anderen Frage, aber immer noch nicht verstehen, warum notifyDataSetChanged nicht funktioniert ... – user8795747

Verwandte Themen