2016-04-15 29 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; 
     } 
    } 
} 
相关问题