Moje wiersze zawierają przycisk, który ma własny odbiornik kliknięć ustawiony w funkcji getView mojego adaptera. Rozróżniam kliknięcia przycisków i faktyczne kliknięcia elementów wiersza przy użyciu Androida: descendantFocusability = "blocksDescendants" w rodzicu wiersza.Android: Zmień tło przycisku w wierszu ListView z onClick
Po kliknięciu przycisku ustawia on prawidłowo tło przycisku, moim problemem jest to, że przewijam listę, ustawiając go również dla różnych wierszy. Zakładam, że jest to problem związany z recyklingiem widoków.
Oto mój kod:
@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);
}
Więc jeśli kliknięciu na przycisk w pozycji rzędu 1 przycisk zmiany tła, jak powinien. Ale kiedy przewijam listę losowo, inne przyciski również się ustawiają. Czasami, gdy przewijam z powrotem do pozycji 1, tło przycisku powraca do oryginału.
Czego mi tu brakuje? Wiem, że mam rację, to jest coś małego, czego nie robię.
Po zmianie na jeśli (true || convertView == null) {... (więc zawsze jest zawyżone), czy to działa dobrze? Nie jest to rozwiązanie, ale chcesz się dowiedzieć, czy problem nie pojawia się już wtedy. –
Tak, to powoduje, że tło nie zmienia się w innych losowych wierszach. Oczywiście nie takie rozwiązanie, jak mówiłaś, ale tak, zatrzymaj problem, dopóki nie przewiń do góry, a przycisk powróci do pierwotnego tła. – askilondz