2016-04-15 30 views
1

我正在使用列表視圖並創建自定義適配器。每次單擊按鈕時,我都想嘗試發佈帖子。正在聲明的按鈕與列表視圖中的每個項目相關聯。我遇到了三個問題:使用我自定義適配器中的變量時遇到問題

1)當我點擊類似按鈕時,點擊列表中的「隨機」按鈕。

2)當我點擊它時,它會更新類似計數,但是當我向下滾動查看視圖時,再向上滾動,類似的計數就會重置。 3)當我點擊like時,like count會改變,現在當我點擊一個不同的帖子時,像count一樣改變,就像第一次點擊的button一樣。

我一直堅持這一段時間任何幫助,非常感謝。

下面是適配器類代碼:

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; 
    } 
} 

這裏是createLike方法:

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; 
} 

回答

0

我認爲根本問題是,你正在使用您的holder類,降static修飾符這個,我相信它會解決你的問題。

+0

沒有解決問題。雖然謝謝! – cdub

0

而不是

holder.like.setOnClickListener(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" 
      } 
); 

現在createLike()你需要更新你的數據集 「posts」 新的 「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

非常感謝您的幫助。我做了一些更改併發布在下面。 @Shadab Ansari – cdub

+0

使用getItem(位置)而不是帖子。 –

+0

getSelectedItem? getSelectedItemPosition? getItem沒有解決。 @Shadab Ansari – cdub

0

好吧,我改變了這個:

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); 
    //  } 
} 

,然後添加參數createLike():

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

不過,我在那裏我應該更新等等計數點很困惑。我加了下面這行:

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

但是我怎麼能夠在這個方法中使用帖子。現在它無法解析符號'帖子'。十分感謝你的幫助。

0

更新:

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; 
     } 
    } 
} 
相關問題