2016-05-06 2 views
1

Ich weiß, dass ein listview in android seine Elemente recycelt und in meinem Fall recycelt die listview sie, wenn Sie nach unten scrollen.setText in listView ändert sich ständig, wenn Sie nach unten scrollen, wegen recycle

Ich versuche, einen Feed zu machen, der mich einen Beitrag "Gefällt mir" lässt.

Hier ist mein Code:

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    final HomeFeedHolder homeFeedHolder; 

    if (inflater == null) 
     inflater = (LayoutInflater) activity 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.home_feed_item, null); 
     homeFeedHolder = new HomeFeedHolder(); 
     homeFeedHolder.tvHomeFeedLike = (TextView) convertView.findViewById(R.id.tvHomeFeedLike); 
     convertView.setTag(homeFeedHolder); 
    } else { 
     homeFeedHolder = (HomeFeedHolder) convertView.getTag(); 
    } 

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

      if (homeFeedHolder.tvHomeFeedLike.getText().toString().equals("Like")) { 
       HomeFeedModel homeFeedModel = (HomeFeedModel) getItem(position); 
       int pid2 = item.getId(); 
       String pid = Integer.toString(pid2); 
       HomeFeedLikePost homeFeedLikePost = new HomeFeedLikePost(position); 
       homeFeedLikePost.execute(pid); 
       homeFeedHolder.tvHomeFeedLike.setText("Unlike"); 
      } 
     } 
    }); 
} 

Wie Sie sehen können, ich nenne setText ("Im Gegensatz zu"), nachdem die tvHomeFeedLike gedrückt wird. Es funktioniert perfekt, aber wenn ich nach unten scrolle und die Listenansicht recycelt wird, wechselt das "Gefällt mir" zu einem anderen Beitrag. Wie kann ich es so machen, dass es per Post versandt wird?

EDIT: Ich bin auch mit Volley

Antwort

0

Sie können den Satz von gemocht Artikel-ID an den Adapter hinzufügen:

Set<Integer> likedItems = new HashSet<>(); 

In getView:

int pid = (HomeFeedModel) getItem(position); 
    if (likedItems.contains(pid)) 
     homeFeedHolder.tvHomeFeedLike.setText("Unlike"); 
    else 
     homeFeedHolder.tvHomeFeedLike.setText("Like"); 

In onClick:

if (likedItems.contains(pid)){ 
     likedItems.remove(pid); 
    } 
    else{ 
     likedItems.add(pid); 
    } 
    if (likedItems.contains(pid)) 
     homeFeedHolder.tvHomeFeedLike.setText("Unlike"); 
    else 
     homeFeedHolder.tvHomeFeedLike.setText("Like"); 
0

ein boolean Feld Klasse zu Ihrem Artikel hinzufügen.

if (inflater == null) 
     inflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.home_feed_item, null); 
     homeFeedHolder = new HomeFeedHolder(); 
     homeFeedHolder.tvHomeFeedLike = (TextView) convertView.findViewById(R.id.tvHomeFeedLike); 

     convertView.setTag(homeFeedHolder); 
    } else { 
     homeFeedHolder = (HomeFeedHolder) convertView.getTag(); 
    } 

    if(item.isLike()) homeFeedHolder.tvHomeFeedLike.setText("Unlike"); 
    else homeFeedHolder.tvHomeFeedLike.setText("Like"); 

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



    if(homeFeedHolder.tvHomeFeedLike.getText().toString().equals("Like")) { 
        HomeFeedModel homeFeedModel= (HomeFeedModel) getItem(position); 

         int pid2 = item.getId(); 
         String pid = Integer.toString(pid2); 
         HomeFeedLikePost homeFeedLikePost = new HomeFeedLikePost(position); 
         homeFeedLikePost.execute(pid); 
         homeFeedHolder.tvHomeFeedLike.setText("Unlike"); 
         item.setLike(true); 
      } 
     } 
    }); 
+0

Was ist "isLike()" ? – johnjay22113

+0

wie ist ein boolean, so sollte der Getter sein isLike() anstelle von getLike() –

+0

Ich glaube nicht, dass Sie meine Frage bekommen ... – johnjay22113

0

in Ihrem HomeFeedModel Objekt Sie einen param hinzufügen sollen, dass es so etwas wie dies würde:

public class HomeFeedModel { 

    //all your attrs 

    private boolean isLiked; 

    public boolean isLiked(){ 
     return isLiked; 
    } 

    public void setIsLiked(boolean liked){ 
     isLiked = liked; 

    } 
    } 

Dann sollten Sie den params außerhalb der onClick Funktion zuweisen, da es die aktuelle Position, während Sie nehmen scrollen, nicht nach dem, was du suchst (wegen Recycling). Ändern Sie auch den Objektstatus auf "Gefällt mir" oder nicht und weisen Sie der Textansicht den Status zu, um immer den neuesten Status des Objekts und nicht des recycelten Objekts zu haben.

Sie sollte so versuchen:

final boolean isLiked = homeFeedHolder.tvHomeFeedLike.getText().toString().equals("Like"); 
    final HomeFeedModel homeFeedModel= (HomeFeedModel) getItem(position); 
    final int pid2 = item.getId(); 
    final String pid = Integer.toString(pid2); 
    final HomeFeedLikePost homeFeedLikePost = new HomeFeedLikePost(position); 

    homeFeedHolder.tvHomeFeedLike.setText(homeFeedModel.isLiked() ? "UnLike" : "Like"); 
    homeFeedHolder.tvHomeFeedLike.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 

      if(isLiked) { 
       homeFeedLikePost.execute(pid); 
       homeFeedModel.setIsLiked(false); 
       homeFeedHolder.tvHomeFeedLike.setText("Unlike"); 
       notifyDataSetChanged(); 
      } 
     } 
    }); 
+0

Guter Versuch, aber nein, das funktioniert nicht – johnjay22113

+0

nein, funktioniert nicht. Ich klickte "Gefällt mir" auf den ersten Post und änderte es in "Unlike" und dann scrollte ich nach unten und dann gescrollt zurück und die "Im Gegensatz" geändert zurück zu "Wie" – johnjay22113

+0

Haben Sie in Ihrem HomeFeedModel die isLiked boolean hinzufügen? Dieser Code funktioniert für mich ... Sind Sie sicher, dass Sie den gleichen Code haben? – JpCrow

0

Wenn Sie die Taste wie und setText("Unlike") für ein bestimmtes Element, müssen Sie diesen Zustand zu halten.

Zuerst müssen Sie verstehen, wie getView() funktioniert. Ihre Methode getView hilft Ihnen grundsätzlich, den Artikel beim Scrollen zu seiner Position zu laden. Welche Ansicht angezeigt wird, bleibt Ihnen überlassen. Insbesondere können Sie festlegen, welche UI-Elemente angezeigt werden sollen (Text, Bild, Schaltfläche usw.). Einige UI-Elemente sind statusabhängig.

In Ihrem Fall zeigt TextView "Im Gegensatz", wenn ein Beitrag gemocht wird und umgekehrt. Das TextView ist statusabhängig. Daher haben Sie Durch das Speichern des Status, beim nächsten Mal .. Ihre Post-Status irgendwo zu „erinnern“, wenn Sie zu diesem Artikel blättern, können Sie Ihre getView Methode entscheiden, welchen Text zu zeigen:

HomeFeedModel homeFeedModel= (HomeFeedModel) getItem(position); 
int pid2 = item.getId(); 
HomeFeedLikePost homeFeedLikePost = new HomeFeedLikePost(position); 
boolean isLiked = homeFeedLikePost.isLiked(); 
if (isLiked) { 
    homeFeedHolder.tvHomeFeedLike.setText("Unlike"); 
} else { 
    homeFeedHolder.tvHomeFeedLike.setText("Like"); 
} 

In obigem Beispiel isLiked ist eine der Eigenschaft in Ihrem HomeFeedLikePost. Das heißt, in dem Moment, in dem du einen Beitrag postest, solltest du diese Eigenschaft ebenfalls in deiner Datenbank aktualisieren (mach das in deinem onClickListener).

Hoffnung, die für Sie Sinn macht.

+0

Ja, sehr gut erklärt. Die .execute (asynctask) ist der Code, um zu überprüfen, ob der Post, der zurückgegeben wird, wie in der Datenbank gefunden oder nicht gefunden wird. Es wird "Erfolg" zurückgeben, wenn es gefunden wird. Wie implementiere ich das um zu arbeiten? – johnjay22113

+0

Ich denke das hängt von deinem Design ab. So verwenden Sie eine asynchrone Aufgabe, um zu finden, ob ein Beitrag gemocht wurde oder nicht. Meine Idee ist, dass jeder Beitrag ein Eintrag in Ihrer Datenbank sein sollte. und jeder Beitrag sollte Felder wie ID, Titel, Inhalt, * gemocht * usw. haben. Wenn Sie Post-Daten in ListView laden, erhalten Sie Ihre Post-Daten, und post.liked wird Ihnen sagen, ob ein Post geladen wurde oder nicht. Das bedeutet, was Ihre asyncTask tun sollte, ist, den Post "liked" als wahr oder falsch zu markieren, wenn Sie klicken. – xialin

+0

Ich habe das bereits implementiert. Ich kann 1 oder 0 zurückgeben, wenn es existiert oder nicht existiert. – johnjay22113