2015-01-01 49 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

相关问题