自定义ListView不保存它的状态

时间:2013-02-07 14:14:49

标签: android listview savestate custom-adapter custom-lists

我正在使用带有ListView项目布局和自定义适配器的标准android simle_list_item_multiple_choice。它在暂停时保存了它并在恢复时恢复。但经过几天的工作后,我在适配器中实现了SectionIndexerStickyListHeadersAdapter接口,并从this库中将ListView更改为StickyListHeadersListView。应用程序中还有其他更改,但这些更改仅附加到ListView。但是现在当我的应用程序恢复工作时,listview将滚动到开始并且所有项目都未选中。我试图删除SectionIndexer接口和粘贴标头支持,但它没有任何效果。也许我需要启用listview的一些隐藏选项?

(尝试了saveState属性 - 没有效果)

public class WordAdapter extends ArrayAdapter<Word> implements SectionIndexer, StickyListHeadersAdapter{
// -----------------------------------------------------------------------
//
// Fields
//
// -----------------------------------------------------------------------
private int mResID;

private List<Word> mList;
private String[] mSectionNames;
private StickyListHeadersListView mListView;
private int[] mSectionIndexes;
private boolean mHeadersEnabled;

// -----------------------------------------------------------------------
//
// Constructor
//
// -----------------------------------------------------------------------
public WordAdapter(Context context, StickyListHeadersListView listView, int resID, List<Word> list, String[] sectionNames, int[] sectionIndexes, boolean enableHeaders) {
    super(context, resID, list);
    mResID = resID;

    mList = list;
    mListView = listView;
    mSectionIndexes = sectionIndexes;
    mSectionNames = sectionNames;

    mHeadersEnabled = enableHeaders;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(mResID, parent, false);
        holder = new ViewHolder();
        holder.root = convertView;
        holder.textView = (TextView) convertView.findViewById(android.R.id.text1);
        holder.checkBox = (CheckBox) convertView.findViewById(android.R.id.checkbox);

        convertView.setTag(holder);
    }
    holder = (ViewHolder) convertView.getTag();

    holder.textView.setText(getItem(position).getValue());
    if(mListView.isItemChecked(position))
        holder.root.setBackgroundColor(getContext().getResources().getColor(R.color.highlight));
    else
        holder.root.setBackgroundColor(getContext().getResources().getColor(android.R.color.transparent));
    return convertView;
}

@Override
public View getHeaderView(int position, View convertView, ViewGroup parent) {
    if(!mHeadersEnabled)
        return new View(getContext());

    HeaderViewHolder holder;
    if (convertView == null) {
        holder = new HeaderViewHolder();
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item_header, parent, false);
        holder.labelView = (TextView) convertView.findViewById(R.id.list_item_header_label);
        convertView.setTag(holder);
    } else {
        holder = (HeaderViewHolder) convertView.getTag();
    }

    String label;
    if(mSectionNames != null){
        label = mSectionNames[getSectionForPosition(position)];
        holder.labelView.setText(label);
    }
    return convertView;
}

@Override
public long getHeaderId(int position) {
    long result = getSectionForPosition(position);
    return result;
}

@Override
public int getPositionForSection(int section) {
    return (mSectionIndexes == null || section < 0 ) ? 0 : (section == mSectionIndexes.length ? mList.size():mSectionIndexes[section]);
}

@Override
public int getSectionForPosition(int position) {
    if(mSectionIndexes != null && position >= mSectionIndexes[0]) {
        for(int i = 0; i < mSectionIndexes.length; ++i)
            if(position < mSectionIndexes[i])
                return i-1;
        return (mSectionIndexes.length - 1);
    }
    return 0;
}

@Override
public Object[] getSections() {
        return mSectionNames == null ? new Object[0] : mSectionNames; 
}
// -------------------------------------------------------------------------------
//
// Internal classes
//
// -------------------------------------------------------------------------------
private static class ViewHolder {
    public View root;
    public TextView textView;
    public CheckBox checkBox;
}

private static class HeaderViewHolder {
    public TextView labelView;
}

这是适配器代码。

0 个答案:

没有答案