我的问题是。我有一个随机行数(15到30)的ListView。 我正在使用自定义ArrayAdapter来显示行。每行包含一个搜索栏,TextViews和开关。 当我移动搜索栏(进度)时,我更改了一些TextView的文本。 当我向下滚动以便搜索栏不再可见时,它们将从头开始重新加载,TextViews以及搜索栏进度和开关状态再次设置为默认值。
是否可以轻松保存整个ListView状态,因此编辑的行在向上和向下滚动时不会丢失数据?
我在CustomAdapter中使用持有者类
private class ViewHolder {
TextView tv_owner;
TextView tv_preset;
SeekBar seekbar;
Switch switch;
}
public View getView(int position, View convertView, ViewGroup parent) {
final MyListViewItem rowItem = getItem(position);
LayoutInflater mInflater = (LayoutInflater) activity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.adapter_123, null);
holder = new ViewHolder();
holder.tv_owner = (TextView) convertView.findViewById(R.id.tv_var_owner);
holder.tv_preset = (TextView) convertView.findViewById(R.id.tv_var_preset);
holder.seekbar = (SeekBar) convertView.findViewById(R.id.seekBar);
holder.switch = (Switch) convertView.findViewById(R.id.switch1;
convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
final Resources res = activity.getResources();
holder.seekbar.setMax(1000);
holder.seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {
holder.tv_owner.setText(String.valueOf(holder.seekbar.getProgress()));
holder.tv_preset.setText("$ " + holder.seekbar.getProgress()*0.5;
}
});
return convertView;
}
答案 0 :(得分:0)
有两种方法可以维持状态。
1)创建一个POJO类&对象的ArrayList并从中管理值,这样每次创建行时,它都会从受尊重的对象中获取值,这有助于管理正确的数据。
2)不要回收你的观点。即创建你的itemView - > holderView查看每一行并管理而不是回收它。 注意:建议不要使用此方法,这只是解决问题的一种方法。
答案 1 :(得分:0)
适配器只是将您的数据转换为查看项目。最简单的情况是它将所有数据缓存在适配器内或在某处保存(DB / Server / File / SharedPreference或其他)以保存更改,当用户稍后再次打开此屏幕或仅更改屏幕方向时再次显示它们。数据保存的方式取决于特定的用例,可能会有所不同。并且ViewHolder不是一个保存值的地方,因为它与不同的MyListViewItem一起重用,以及它存在的主要原因 - 只是保持视图而不是在我们再次尝试重用视图时找不到它,这有助于提高ListView滚动速度。
在您的情况下,您可以将进度值保存到MyListViewItem中。在你的情况下,只需做这样的事情:
public class CustomAdapter extends ArrayAdapter{
...
private class ViewHolder {
TextView tv_owner;
TextView tv_preset;
SeekBar seekbar;
Switch switch;
}
public View getView(int position, View convertView, ViewGroup parent) {
final MyListViewItem rowItem = getItem(position);
LayoutInflater mInflater = (LayoutInflater) activity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.adapter_123, null);
holder = new ViewHolder();
holder.tv_owner = (TextView) convertView.findViewById(R.id.tv_var_owner);
holder.tv_preset = (TextView) convertView.findViewById(R.id.tv_var_preset);
holder.seekbar = (SeekBar) convertView.findViewById(R.id.seekBar);
holder.switch = (Switch) convertView.findViewById(R.id.switch1;
convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
}
final Resources res = activity.getResources();
holder.seekbar.setMax(1000);
holder.seekbar.setProgress(rowItem.getProgress());
holder.seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {
rowItem.setProgress(progress);
holder.tv_preset.setText("$ " + progress*0.5;
}
});
return convertView;
}
}