Android: изменить фон кнопки в ListView Row с помощью onClick - PullRequest
7 голосов
/ 10 ноября 2011

Мои строки содержат кнопку, для которой в getView моего адаптера установлен собственный прослушиватель кликов.У меня есть возможность различать щелчки моей кнопки и фактические щелчки элементов строки с помощью android.Я прокручиваю список и настраиваю его для разных строк.Я предполагаю, что их проблема где-то с переработкой просмотров.

Вот мой код:

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

    if(convertView == null){

        holder = new ViewHolder();

        convertView = inflater.inflate(R.layout.todays_sales_favorite_row, null);
        holder.favCatBtn = (Button)convertView.findViewById(R.id.favCatBtn);            

        convertView.setTag(holder);

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

        holder.favCatBtn.setTag(position);
        holder.favCatBtn.setOnClickListener(this);

    return convertView;
 }

@Override
public void onClick(View v) {
    int pos = (Integer) v.getTag();
    Log.d(TAG, "Button row pos click: " + pos);
    RelativeLayout rl = (RelativeLayout)v.getParent();
    holder.favCatBtn = (Button)rl.getChildAt(0);
    holder.favCatBtn.setBackgroundResource(R.drawable.icon_yellow_star_large);

}

Так что, если я нажимаю кнопку в строке 1, фон кнопки меняется, как и должно быть.Но затем, когда я прокручиваю список случайным образом, устанавливаются и другие кнопки.Затем, когда я прокручиваю обратно в положение 1, фон кнопки снова возвращается к оригиналу.

Что мне здесь не хватает?Я знаю, что я тут что-то незначительное, что я не делаю.

Ответы [ 3 ]

8 голосов
/ 10 ноября 2011

Да, вы правы, взгляды переработаны. Вам нужно будет отследить, какие позиции были нажаты, и обновить фоновый ресурс в вашем методе getView. Например, я расширил ваш код, добавив переключение фона:

private final boolean[] mHighlightedPositions = new boolean[NUM_OF_ITEMS];

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

    if(convertView == null){
        holder = new ViewHolder();
        convertView = inflater.inflate(R.layout.todays_sales_favorite_row, null);
        holder.favCatBtn = (Button)convertView.findViewById(R.id.favCatBtn);
        holder.favCatBtn.setOnClickListener(this);
        convertView.setTag(holder);
    }else {
        holder = (ViewHolder)convertView.getTag();
    }

    holder.favCatBtn.setTag(position);

    if(mHighlightedPositions[position]) {
        holder.favCatBtn.setBackgroundResource(R.drawable.icon_yellow_star_large);
    }else {
        holder.favCatBtn.setBackgroundResource(0);
    }

    return convertView;
}

@Override
public void onClick(View view) {
    int position = (Integer)view.getTag();
    Log.d(TAG, "Button row pos click: " + position);

    // Toggle background resource
    RelativeLayout layout = (RelativeLayout)view.getParent();
    Button button = (Button)layout.getChildAt(0);
    if(mHighlightedPositions[position]) {
        button.setBackgroundResource(0);
        mHighlightedPositions[position] = false;
    }else {
        button.setBackgroundResource(R.drawable.icon_yellow_star_large);
        mHighlightedPositions[position] = true;
    }
}
0 голосов
/ 27 ноября 2015

Я нашел идеальное, короткое и чистое решение для этого с помощью StateListDrawable:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    currentPosition = position;
    holder = null;
    if (convertView == null) {
        holder = new Holder();
        LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = vi.inflate(R.layout.grid_item, null);
        holder.imageView = (ImageView) convertView.findViewById(R.id.gridItemBtn);

        StateListDrawable states = new StateListDrawable();
        states.addState(new int[] {android.R.attr.state_pressed},
                ContextCompat.getDrawable(context, R.drawable.pressed_state));
        states.addState(new int[] {android.R.attr.state_focused},
                ContextCompat.getDrawable(context, R.drawable.focused_state));
        states.addState(new int[]{},
                ContextCompat.getDrawable(context, R.drawable.default_state));
        holder.imageView.setImageDrawable(states);
    }

    return convertView;
}

Это по-прежнему прекрасно работает вместе с OnClickListener, где вы можете делать важные вещи.

0 голосов
/ 10 июля 2015
holder.btnUnLock.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {
 // TODO Auto-generated method stub
 // Button btn = Button(v);
   holder = (ViewHolder) v.getTag();
   holder.btnSetLock.setBackgroundResource(R.drawable.btn_lock_bg_right);
holder.btnUnLock.setBackgroundResource(R.drawable.btn_unlock_bg_left);

}
});
...