Ответ 1
Android перерабатывает элементы списка для повышения производительности. Настоятельно рекомендуется повторно использовать их, если вы хотите, чтобы ListView прокручивался плавно.
Для каждого элемента списка вызывается функция getView
вашего адаптера. Там, где вы должны назначить значения для элемента, который запрашивает ListView.
Взгляните на этот пример:
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder = null;
if ( convertView == null )
{
/* There is no view at this position, we create a new one.
In this case by inflating an xml layout */
convertView = mInflater.inflate(R.layout.listview_item, null);
holder = new ViewHolder();
holder.toggleOk = (ToggleButton) convertView.findViewById( R.id.togOk );
convertView.setTag (holder);
}
else
{
/* We recycle a View that already exists */
holder = (ViewHolder) convertView.getTag ();
}
// Once we have a reference to the View we are returning, we set its values.
// Here is where you should set the ToggleButton value for this item!!!
holder.toggleOk.setChecked( mToggles.get( position ) );
return convertView;
}
Обратите внимание, что ViewHolder
- это статический класс, который мы используем для повторного использования этого представления. Его свойства - это виды, которые имеют элементы вашего списка. Он объявлен в вашем адаптере.
static class ViewHolder{
ToggleButton toggleOk;
}
mToggles
объявляется как частное свойство в вашем адаптере и устанавливается с помощью общедоступного метода, например:
public void setToggleList( ArrayList<Boolean> list ){
this.mToggles = list;
notifyDataSetChanged();
}
Дополнительную информацию см. в других пользовательских примерах ListView.
Надеюсь, что это поможет.