2016-04-15 7 views
1

私はリストビューを使用してカスタムアダプターを作成しています。私はボタンがクリックされるたびに投稿が好きです。宣言されているボタンは、リストビューの各項目に関連付けられています。私が遭遇している3つの問題があります:カスタムアダプターの変数を使用する際の問題

1)私が好きなボタンをクリックすると、リストの下の "ランダム"ボタンもクリックされます。

2)私が好きなようにクリックすると、同様のカウントが更新されますが、ビューの外にスクロールしてからスクロールバックすると、同様のカウントがリセットされます。

3)私が好きなようにクリックすると、同じ数が変わります。別の投稿を好きなようにクリックすると、同じような数が同じように変化します。

私はこれにしばらくお待ちしておりますが、何か助けに感謝します。ここで

は、アダプタクラスのコードです:ここで

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

私は根本問題は、あなたが、ドロップをお使いのホルダークラスにstatic修飾子を使用していることだと思いますこれと私はあなたの問題を解決すると信じています。代わりに

holder.like.setOnClickListener(this); 

+0

は、問題を解決しませんでした。しかし、ありがとう! – cdub

0

これを試してみてください - あなたが新しいとデータセット "posts" を更新する必要がcreateLike()で今

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

のような "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(position)を使用します。 –

+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; 
     } 
    } 
} 
関連する問題