2011-11-10 14 views
7

Hàng của tôi chứa nút có trình nghe nhấp chuột riêng được đặt trong getView của bộ điều hợp của tôi. Tôi có thể phân biệt giữa số lần nhấp vào nút của mình và số lần nhấp vào mục hàng thực tế bằng cách sử dụng android: descendantFocusability = "blocksDescendants" trong phụ huynh của hàng.Android: Thay đổi nền nút trong ListView Row với onClick

Khi tôi nhấp vào nút, nó đặt nền nút chính xác, vấn đề của tôi là khi tôi cuộn qua danh sách, thiết lập nó cũng cho các hàng khác nhau. Tôi cho rằng vấn đề của họ là một nơi nào đó với chế độ xem tái chế.

Dưới đây là mã của tôi:

@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); 

} 

Vì vậy, nếu tôi bấm vào nút ở vị trí hàng 1 sự thay đổi nền nút như nó phải. Nhưng sau đó khi tôi di chuyển xuống danh sách các nút ngẫu nhiên khác cũng đang được thiết lập. Sau đó, đôi khi khi tôi cuộn lùi lại vị trí 1, nền của nút quay lại trở lại bản gốc lần nữa.

Tôi thiếu gì ở đây? Tôi biết tôi đang ở ngay đó chỉ là thứ gì đó nhỏ nhặt mà tôi không làm.

+0

Khi bạn thay đổi thành (true || convertView == null) {... (vì vậy nó luôn luôn tăng cao), nó có hoạt động tốt không? Không phải là một giải pháp, chỉ muốn biết nếu vấn đề không xuất hiện sau đó nữa. –

+0

Yea dừng nền thay đổi trên các hàng ngẫu nhiên khác. Rõ ràng không phải là giải pháp như bạn nói nhưng có nó dừng lại vấn đề cho đến khi tôi di chuyển trở lại lên và nút reverts trở lại nền ban đầu của nó. – askilondz

Trả lời

8

Có, bạn nói đúng, các chế độ xem được tái chế. Bạn sẽ cần theo dõi vị trí nào đã được nhấp vào và cập nhật tài nguyên nền trong phương thức getView của bạn. Ví dụ, tôi mở rộng mã của bạn để thêm toggling nền:

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

Cảm ơn bạn! Tôi chỉ cần thay đổi 0 trong setBackgroundResource (0) để drawable khác của tôi và tất cả mọi thứ hoạt động như dự định. Cảm ơn một tấn! – askilondz

+0

@Chase hãy giúp tôi http://stackoverflow.com/questions/17482001/change-imageview-backgroundresource-in-listview-onitemselected-android – yakusha

+0

Dude, bạn cứu cuộc sống của tôi – Harry

-1
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); 

} 
}); 
+0

Bạn cũng có thể thêm giải thích? – Robert

1

Tôi tìm thấy một giải pháp hoàn hảo, ngắn và sạch sẽ cho điều này bằng 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; 
} 

này hoạt động vẫn hoàn hảo cùng với OnClickListener nơi bạn có thể làm những thứ quan trọng của mình.