2015-01-01 48 views
-1

我在OnClickListener變化的背景圖標集:的Android - 適配器錯誤的位置

 holder.rating_good.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       holder.rating_good.setBackgroundResource(R.drawable.ic_thumb_up_red); 
       apiMethods.ChangePostRating(ctx, String.valueOf(item.getId()), "up", holder.rating, holder.rating_good); 
      } 

     }); 

     holder.rating_bad.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       holder.rating_good.setBackgroundResource(R.drawable.ic_thumb_down_red); 
       apiMethods.ChangePostRating(ctx, String.valueOf(item.getId()), "down", holder.rating, holder.rating_bad); 
      } 

     }); 

但在一些項目的背景更改,即使我沒有按下按鈕。 Standart背景ImageView如果這rating_good - R.drawable.ic_thumb_down_grey,如果這rating_bad - R.drawable.ic_thumb_down_grey。

我getView:

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

     if (inflater == null) 
      inflater = (LayoutInflater) activity 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     if (imageLoader == null) 
      imageLoader = AppController.getInstance().getImageLoader(); 

     if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = inflater.inflate(R.layout.feed_item, parent, false); 

      holder.rating_good = (ImageView) convertView.findViewById(R.id.imageRatingGood); 
      holder.rating_bad = (ImageView) convertView.findViewById(R.id.imageRatingBad); 
      holder.rating = (TextView) convertView.findViewById(R.id.feedRating); 
      holder.rating.setTag(position); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

      try { 

       item = feedItems.get(position); 
       ctx = parent.getContext(); 

      holder.rating_good.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        holder.rating_good.setBackgroundResource(R.drawable.ic_thumb_up_red); 
        apiMethods.ChangePostRating(ctx, String.valueOf(item.getId()), "up", holder.rating, holder.rating_good); 
       } 

      }); 

      holder.rating_bad.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        holder.rating_good.setBackgroundResource(R.drawable.ic_thumb_down_red); 
        apiMethods.ChangePostRating(ctx, String.valueOf(item.getId()), "down", holder.rating, holder.rating_bad); 
       } 

      }); 

      //OTHER SOME CODE 

       } catch (Exception e) { 
        e.printStackTrace(); 
        Mint.logException(e); 
       } 

     return convertView; 
    } 

static class ViewHolder { 
     TextView nickname; 
     TextView date; 
     TextView description; 
     TextView rating; 
     TextView type; 
     FeedImageView feedImageView; 
     ImageView rating_good; 
     ImageView rating_bad; 
     ImageView type_image; 
     LinearLayout linear; 
} 

ApiMethods類:

public void ChangePostRating(Context new_ctx, String id, String rate, TextView textview, ImageView rView) { 
      ctx = new_ctx; 
      token = pref.GetToken(ctx); 
      content_id = id; 
      rating_string = rate; 
      url = apiUrl.GetUrlChangeRating(); 
      app_id = info.app_key; 
      myView = textview; 
      imageButton = (ImageView) rView; 

      RequestQueue queue = Volley.newRequestQueue(ctx); 
      StringRequest sr = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { 
       @Override 
       public void onResponse(String responses) { 
        try { 
         JSONObject response = new JSONObject(responses); 
         String status = response.getString("status"); 
         if (!status.contains("error")) { 
          JSONObject data = response.getJSONObject("data"); 
          int rating = data.getInt("rating"); 
          TextView text_rating = (TextView) myView; 
          text_rating.setText(String.valueOf(rating)); 
          if (Integer.valueOf(text_rating.getText().toString()) < 0) { 
           text_rating.setTextColor(ctx.getResources().getColor(R.color.feed_item_rating_bad)); 
          } else { 
           text_rating.setTextColor(ctx.getResources().getColor(R.color.feed_item_rating_good)); 
          } 
         } else { 
          JSONObject error = response.getJSONObject("error"); 
          String message = error.getString("message"); 
          parseError(message); 
          if (rating_string.contains("up")) { 
           imageButton.setBackgroundResource(R.drawable.ic_thumb_up_grey); 
          } else { 
           imageButton.setBackgroundResource(R.drawable.ic_thumb_down_grey); 
          } 

         } 

        } catch (JSONException e) { 
         Mint.logException(e); 
        } 
       } 
      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Mint.logException(error); 
       } 
      }); 
      queue.add(sr); 
     } 

回答

0

您應該只訂閱每觀看一次的事件處理程序如下圖所示(未經測試,因爲我在這裏鍵入它,但你的想法) 。多次訂閱它們會導致問題,因爲您正在緩存它們(因此使用ViewHolder)。

現在無論這是否解決您的問題是另一回事,但它仍然是您需要解決的問題。

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

    if (imageLoader == null) 
     imageLoader = AppController.getInstance().getImageLoader(); 

    if (convertView == null) { 
     if (inflater == null) 
      inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     holder = new ViewHolder(); 
     convertView = inflater.inflate(R.layout.feed_item, parent, false); 

     holder.rating_good = (ImageView) convertView.findViewById(R.id.imageRatingGood); 
     holder.rating_bad = (ImageView) convertView.findViewById(R.id.imageRatingBad); 
     holder.rating = (TextView) convertView.findViewById(R.id.feedRating); 

     holder.rating_good.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       ViewHolder viewHolder = (ViewHolder)v.getTag() 
       viewHolder.rating_good.setBackgroundResource(R.drawable.ic_thumb_up_red); 
       apiMethods.ChangePostRating(ctx, String.valueOf(viewHolder.item.getId()), "up", viewHolder.rating, viewHolder.rating_good); 
      } 
     }); 

     holder.rating_bad.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       ViewHolder viewHolder = (ViewHolder)v.getTag() 
       viewHolder.rating_good.setBackgroundResource(R.drawable.ic_thumb_up_green); 
       apiMethods.ChangePostRating(ctx, String.valueOf(viewHolder.item.getId()), "down", viewHolder.rating, viewHolder.rating_bad); 
      } 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

     try { 

      item = feedItems.get(position); 
      ctx = parent.getContext(); 
      holder._rating_bad.setTag(holder); 
      holder._rating_good.setTag(holder); 
      holder.rating.setTag(position); 
      holder._item = item; 
     }); 

     //OTHER SOME CODE 

      } catch (Exception e) { 
       e.printStackTrace(); 
       Mint.logException(e); 
      } 

    return convertView; 
} 
+0

不行,總是在一些飼料後更改圖標,即使我沒有按下按鈕 – user3632418

+0

更新它,因爲有你的代碼的另一個問題。再次嘗試更新的代碼,看看是否有幫助。 – kha

+0

holder._rating_bad.setTag(holder); - 也許holder.rating_bad.setTag(持有人); ?沒有「_」? 我將我的ViewHolder添加到拳頭帖子,請參閱。 – user3632418

相關問題