滚动时保存Android ListView项目

时间:2015-02-27 05:45:53

标签: android listview android-listview

我的问题是。我有一个随机行数(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;
    }

2 个答案:

答案 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;
    }
}