2016-04-15 18 views
1

Ich verwende eine Listenansicht und einen benutzerdefinierten Adapter erstellen. Ich versuche jedes Mal, wenn der Button angeklickt wird, einen Post zu mögen. Der deklarierte Button ist mit jedem Eintrag in der Listenansicht verbunden. Es gibt drei Probleme, denen ich begegne:Problem mit Variablen von meinem benutzerdefinierten Adapter

1) Wenn ich auf die gleiche Schaltfläche klicke, wird auch eine "zufällige" Schaltfläche in der Liste angeklickt.

2) Wenn ich auf "Gefällt mir" klicke, wird die Anzahl der gleichwertigen Dateien aktualisiert, aber wenn ich nicht mehr in der Ansicht blättern kann, scrolle ich zurück, die entsprechende Anzahl wird zurückgesetzt.

3) Wenn ich auf "Gefällt mir" klicke, ändert sich die Anzahl der Klicks. Wenn ich jetzt auf einen anderen Beitrag klicke, ändert sich die Zählung wie auf der ersten Schaltfläche, auf die ich geklickt habe.

Ich habe auf dieser für eine Weile fest, jede Hilfe wird sehr geschätzt. Hier

ist der Code für Adapterklasse:

class PostsAdapter extends ArrayAdapter<Posts> implements View.OnClickListener { 
    //used to create views from xml 
    private LayoutInflater layoutInflater; 

    public PostsAdapter(Context context, int textViewResourceId, List<Posts> posts) { 
     super(context, textViewResourceId, posts); 
     layoutInflater = LayoutInflater.from(context); 
    } 
    //add to xml from dataset 
    @Override 
    // view convertview = recycled view 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = convertView; 
     Holder holder = null; 
     Posts posts = getItem(position); 

     //checks if recycled view is null, thewn creates new view, if not null, use same view 
     if(view == null){ 
      view = layoutInflater.inflate(R.layout.activity_posts, null); 

      Button like = (Button) view.findViewById(R.id.btnLike); 
      TextView content = (TextView) view.findViewById(R.id.content); 
      TextView user = (TextView) view.findViewById(R.id.user); 
      TextView topic = (TextView) view.findViewById(R.id.topic); 
      TextView date = (TextView) view.findViewById(R.id.date); 
      TextView likes = (TextView) view.findViewById(R.id.likeCount); 
      TextView hiddenId = (TextView) view.findViewById(R.id.hiddenID); 

      holder = new Holder(content, user, topic, date, likes, hiddenId, like); 

      view.setTag(holder); 
      like.setTag(holder); 
     } 
     else{ 
      holder = (Holder) view.getTag(); 
     } 
     holder.content.setText(posts.getContent()); 
     holder.user.setText(posts.getUser()); 
     holder.topic.setText(posts.getTopic()); 
     holder.date.setText(posts.getDate()); 
     holder.likes.setText(posts.getLikes()); 
     holder.hiddenId.setText(posts.getId()); 

     holder.like.setOnClickListener(this); 

     return view; 
    } 

    @Override 
    public void onClick(View v) { 
     Button like = (Button) v; 
     Holder holder = (Holder) v.getTag(); 
     Toast.makeText(DisplayPosts.this, "Button: " + like.getText(), Toast.LENGTH_LONG).show(); 

     createLike(holder.like, holder.hiddenId, holder.likes); 
    } 
} 

static class Holder{ 
    public TextView content; 
    public TextView user; 
    public TextView topic; 
    public TextView date; 
    public TextView likes; 
    public TextView hiddenId; 
    public Button like; 

    public Holder(TextView content, TextView user, TextView topic, TextView date, TextView likes, TextView hiddenId, Button like) { 
     this.content = content; 
     this.user = user; 
     this.topic = topic; 
     this.date = date; 
     this.likes = likes; 
     this.hiddenId = hiddenId; 
     this.like = like; 
    } 
} 

Hier ist createLike Methode:

private void createLike(final Button like, final TextView hiddenid, final TextView likes){ 
    final String hid = hiddenid.getText().toString().trim(); 

    if(like.getText().toString().equalsIgnoreCase("like")){ 
     like.setText("UnLike"); 
     StringRequest stringRequest = new StringRequest(Request.Method.POST, Config.SERVER_ADDRESS + "LikePost.php", 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 

         JSONObject jsonObject = null; 
         try { 
          //json string to jsonobject 
          jsonObject = new JSONObject(response); 
          //get json sstring created in php and store to JSON Array 
          result2 = jsonObject.getJSONArray(Config.json_array_likes); 
          //get username from json array 
          likes.setText(getLikeCount(result2)); 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
        } 
       }){ 
      @Override 
      protected Map<String, String> getParams() throws AuthFailureError { 

       // corresponding values. 
       Map<String,String> hashMap = new HashMap<>(); 
       //maps specified string key, to specified string value 
       hashMap.put(Config.hid, hid); 
       return hashMap; 
      } 
     }; 

     //add string request to queue 
     RequestQueue requestQueue = Volley.newRequestQueue(this); 
     requestQueue.add(stringRequest); 
    } 
    else{ 
     like.setText("Like"); 
    } 
} 
private String getLikeCount(JSONArray jsonArray){ 
    String lc = null; 
    for(int i = 0; i < jsonArray.length(); i++) { 
     try { 
      JSONObject json = jsonArray.getJSONObject(i); 
      likeCount.add(json.getString(Config.getLike)); 
      lc = likeCount.get(0); 
     } catch (JSONException e) { 
     } 
    } 
    return lc; 
} 

Antwort

0

Ich denke, die Wurzel Problem ist, dass Sie einen statischen Modifikator auf dem Halter Klasse verwenden, Tropfen Dies und ich glaube, es wird Ihr Problem lösen.

+0

Haben das Problem nicht beheben. Trotzdem danke! – cdub

0

Statt

holder.like.setOnClickListener(this); 

Try this -

holder.like.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       createLike(position,holder.like, holder.hiddenId, holder.likes);//Added one more parameter "position" 
      } 
); 

Jetzt in createLike() haben Sie Ihre Daten-Set "posts" mit dem neuen wie für die Elementanzahl in aktualisieren auf "position" -

     @Override 
         public void onResponse(String response) { 

          JSONObject jsonObject = null; 
          try { 
           //json string to jsonobject 
           jsonObject = new JSONObject(response); 
           //get json sstring created in php and store to JSON Array 
           result2 = jsonObject.getJSONArray(Config.json_array_likes); 
           //get username from json array 
           likes.setText(getLikeCount(result2)); 

//Update like count here 
posts.get(position).setLikeCount(); //The count which you want to update 

          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 
         } 
+0

Vielen Dank für die Hilfe. Ich habe einige deiner Änderungen vorgenommen und unten gepostet. @Shadab Ansari – cdub

+0

Verwenden Sie getItem (Position) anstelle von Posts. –

+0

getSelectedItem? getSelectedItemPosition? getItem wurde nicht aufgelöst. @Shadab Ansari – cdub

0

Okay, also habe ich geändert:

final Holder finalHolder = holder; 
     holder.like.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        createLike(position, finalHolder.like, finalHolder.hiddenId, finalHolder.likes);//Added one more parameter "position" 
       } 
     }); 
     return view; 
    } 

    //  @Override 
    //  public void onClick(View v) { 
    //   Button like = (Button) v; 
    //   Holder holder = (Holder) v.getTag(); 
    //   Toast.makeText(DisplayPosts.this, "Button: " + like.getText(), Toast.LENGTH_LONG).show(); 
    // 
    //   createLike(holder.like, holder.hiddenId, holder.likes); 
    //  } 
} 

und dann hinzugefügt Parameter createLike():

private void createLike(final int position, final Button like, final TextView hiddenid, final TextView likes){ 

aber ich bin an dem Punkt, verwirrt, wo soll ich die wie Graf aktualisieren. Ich habe diese Zeile hinzugefügt:

 posts.get(position).setLikeCount(likes); 

aber wie soll ich Posts in dieser Methode verwenden können. Im Moment kann das Symbol "Beiträge" nicht aufgelöst werden. Vielen Dank für die Hilfe.

0

Update:

public class PostsAdapter extends ArrayAdapter<Posts> { 
    //used to create views from xml 
    Context context; 
    int textViewResourceId; 
    ArrayList<Posts> mPosts = new ArrayList<Posts>(); 

    public PostsAdapter(Context context, int textViewResourceId, ArrayList<Posts> posts) { 
     super(context, textViewResourceId, posts); 
     this.textViewResourceId = textViewResourceId; 
     this.context = context; 
     this.mPosts = posts; 
    } 

    // view convertview = recycled view 
    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View view = convertView; 
     final Holder holder; 
     //checks if recycled view is null, thewn creates new view, if not null, use same view 
     if(view == null){ 
      LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
      view = inflater.inflate(textViewResourceId, parent, false); 

      Button like = (Button) view.findViewById(R.id.btnLike); 
      TextView content = (TextView) view.findViewById(R.id.content); 
      TextView user = (TextView) view.findViewById(R.id.user); 
      TextView topic = (TextView) view.findViewById(R.id.topic); 
      TextView date = (TextView) view.findViewById(R.id.date); 
      TextView likes = (TextView) view.findViewById(R.id.likeCount); 
      TextView hiddenId = (TextView) view.findViewById(R.id.hiddenID); 
      holder = new Holder(content, user, topic, date, likes, hiddenId, like); 

      view.setTag(holder); 
     } 
     else{ 
      holder = (Holder) view.getTag(); 
     } 

     Posts posts = mPosts.get(position); 
     holder.content.setText(posts.getContent()); 
     holder.user.setText(posts.getUser()); 
     holder.topic.setText(posts.getTopic()); 
     holder.date.setText(posts.getDate()); 
     holder.likes.setText(posts.getLikes()); 
     holder.hiddenId.setText(posts.getId()); 

     holder.like.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       createLike(position, holder.like, holder.hiddenId, holder.likes);//Added one more parameter "position" 
      } 
     }); 

     return view; 
    } 

    private void createLike(final int position, final Button like, final TextView hiddenid, final TextView likes){ 
     final String hid = hiddenid.getText().toString().trim(); 

     if(like.getText().toString().equalsIgnoreCase("like")){ 
      like.setText("UnLike"); 
      StringRequest stringRequest = new StringRequest(Request.Method.POST, Config.SERVER_ADDRESS + "LikePost.php", 
        new Response.Listener<String>() { 
         @Override 
         public void onResponse(String response) { 

          JSONObject jsonObject = null; 
          try { 
           //counter 
           n+=1; 

           //json string to jsonobject 
           jsonObject = new JSONObject(response); 
           //get json sstring created in php and store to JSON Array 
           result2 = jsonObject.getJSONArray(Config.json_array_likes); 
           //get username from json array 
           String likestring = getLikeCount(result2); 
           String likenum = mPosts.get(position).getLikes(likestring); 
           likes.setText(likenum); 

          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 
         } 
        }, 
        new Response.ErrorListener() { 
         @Override 
         public void onErrorResponse(VolleyError error) { 
         } 
        }){ 
       @Override 
       protected Map<String, String> getParams() throws AuthFailureError { 

        // corresponding values. 
        Map<String,String> hashMap = new HashMap<>(); 
        //maps specified string key, to specified string value 
        hashMap.put(Config.hid, hid); 
        return hashMap; 
       } 
      }; 

      //add string request to queue 
      RequestQueue requestQueue = Volley.newRequestQueue(DisplayPosts.this); 
      requestQueue.add(stringRequest); 
     } 
     else{ 
      like.setText("Like"); 
     } 
    } 
    private String getLikeCount(JSONArray jsonArray){ 
     System.out.println("JSON: " + jsonArray); 
     String lc = null; 
     for(int i = 0; i < jsonArray.length(); i++) { 
      try { 
       JSONObject json = jsonArray.getJSONObject(i); 
       likeCount.add(json.getString(Config.getLike)); 
       System.out.println("i: " + i); 
       lc = likeCount.get(n - 1); 
      } catch (JSONException e) { 
      } 
     } 
     System.out.println("LC: " + lc); 
     return lc; 
    } 
    class Holder{ 
     public TextView content; 
     public TextView user; 
     public TextView topic; 
     public TextView date; 
     public TextView likes; 
     public TextView hiddenId; 
     public Button like; 

     public Holder(TextView content, TextView user, TextView topic, TextView date, TextView likes, TextView hiddenId, Button like) { 
      this.content = content; 
      this.user = user; 
      this.topic = topic; 
      this.date = date; 
      this.likes = likes; 
      this.hiddenId = hiddenId; 
      this.like = like; 
     } 
    } 
} 
Verwandte Themen