繁体   English   中英

如何在列表视图中保存视图状态

[英]how to save state of view in listview

在我的应用程序中,我使用ListView显示检查清单。 检查清单中的每一行都由一个模型表示,该模型是ChecklistenPunkt类的对象。 有三种不同类型的行:

  1. 标题
  2. 附加文字
  3. 一个问题

第三种类型的具有两个Buttons在它被由两个链接的OnClickListeners :第一Button为肯定的回答,第二个为一个否定的回答。 构建视图时,它们都为灰色,表示此问题尚未回答。 如果单击左Button ,它将变为绿色,第二个按钮将变为深灰色背景。 如果单击了正确的Button ,它将变为红色,而第一个将变为深灰色背景。 Button被点击接听状态保存为ChecklistenPunktStatus 这是一个Enum ,具有三个条目(好的,不好,没有回答)。

这是三行Buttons的小图像,显示了不同的状态:

在此处输入图片说明

这是我的适配器代码:

public class ChecklisteAdapter extends ArrayAdapter<Object> {

    private List<ChecklistenPunkt> list;
    private SparseArray<ChecklistenPunktStatus> sparseArray;
    private Context context;

    public ChecklisteAdapter(Context context, List<ChecklistenPunkt> objects) {
        super(context, 0);
        list = objects;
        sparseArray = new SparseArray<ChecklistenPunktStatus>();
        for (int i = 0; i < list.size(); i++) {
            sparseArray.put(i, ChecklistenPunktStatus.NICHT_SELEKTIERT);
        }
        this.context = context;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public ChecklistenPunkt getItem(int position) {
        return list.get(position);
    }

    @Override
    public int getItemViewType(int position) {
        ChecklistenPunkt p = (ChecklistenPunkt) list.get(position);
        return p.getTyp();
    }

    @Override
    public int getViewTypeCount() {
        return 3;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View v = null;
        int type = getItemViewType(position);
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            final ViewHolder viewHolder = new ViewHolder();
            switch (type) {
                case Util.CHECKLISTE_FRAGE:
                    v = inflater.inflate(R.layout.pruefung_durchfuehren_list_item_frage, null);
                    viewHolder.nummer = (TextView) v.findViewById(R.id.check_nummer);
                    viewHolder.komponente = (TextView) v.findViewById(R.id.check_komponente);
                    viewHolder.funktion = (TextView) v.findViewById(R.id.check_funktion);
                    viewHolder.kriterium = (TextView) v.findViewById(R.id.check_kriterium);
                    viewHolder.erlaeuterung = (TextView) v.findViewById(R.id.check_erlaeuterung);
                    viewHolder.io = (Button) v.findViewById(R.id.button_i_o);
                    viewHolder.nio = (Button) v.findViewById(R.id.button_n_i_o);
                    viewHolder.io.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            viewHolder.io.setBackgroundColor(Color.GREEN);
                            viewHolder.io.setEnabled(false);
                            viewHolder.nio.setBackgroundColor(Color.GRAY);
                            viewHolder.nio.setEnabled(true);
                            sparseArray.put(position, ChecklistenPunktStatus.IN_ORDNUNG);
                        }
                    });
                    viewHolder.nio.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            viewHolder.nio.setBackgroundColor(Color.RED);
                            viewHolder.nio.setEnabled(false);
                            viewHolder.io.setBackgroundColor(Color.GRAY);
                            viewHolder.io.setEnabled(true);
                            sparseArray.put(position, ChecklistenPunktStatus.NICHT_IN_ORDNUNG);
                        }
                    });
                    ChecklistenPunktStatus status = sparseArray.get(position);
                    if (status == ChecklistenPunktStatus.IN_ORDNUNG) {
                        viewHolder.io.setBackgroundColor(Color.GREEN);
                        viewHolder.io.setEnabled(false);
                        viewHolder.nio.setBackgroundColor(Color.GRAY);
                        viewHolder.nio.setEnabled(true);
                    } else if (status == ChecklistenPunktStatus.NICHT_IN_ORDNUNG) {
                        viewHolder.nio.setBackgroundColor(Color.RED);
                        viewHolder.nio.setEnabled(false);
                        viewHolder.io.setBackgroundColor(Color.GRAY);
                        viewHolder.io.setEnabled(true);
                    } else if (status == ChecklistenPunktStatus.NICHT_SELEKTIERT) {
                        viewHolder.nio.setBackgroundColor(Color.parseColor("#cccccc"));
                        viewHolder.nio.setEnabled(true);
                        viewHolder.io.setBackgroundColor(Color.parseColor("#cccccc"));
                        viewHolder.io.setEnabled(true);
                    }

                    v.setTag(viewHolder);
                    break;
                case Util.CHECKLISTE_UEBERSCHRIFT:
                    v = inflater.inflate(R.layout.pruefung_durchfuehren_list_item_head, null);
                    viewHolder.headline = (TextView) v.findViewById(R.id.check_headline);
                    viewHolder.headnummer = (TextView) v.findViewById(R.id.check_headnummer);
                    v.setTag(viewHolder);
                    break;
                case Util.CHECKLISTE_ZUSATZTEXT:
                    v = inflater.inflate(R.layout.pruefung_durchfuehren_list_item_text, null);
                    viewHolder.text = (TextView) v.findViewById(R.id.check_text);
                    viewHolder.textnummer = (TextView) v.findViewById(R.id.check_textnummer);
                    v.setTag(viewHolder);
                    break;
                default:
                    throw new IllegalArgumentException("ViewType " + type + " unbekannt!");
            }
        } else {
            v = convertView;
        }

        ChecklistenPunkt clp = getItem(position);
        ViewHolder viewHolder = (ViewHolder) v.getTag();
        if (clp != null) {
            switch (type) {
                case Util.CHECKLISTE_FRAGE: {
                    viewHolder.nummer.setText(clp.getNummer());
                    viewHolder.komponente.setText(clp.getKomponente());
                    viewHolder.funktion.setText(clp.getFunktion());
                    viewHolder.kriterium.setText(clp.getKriterium());
                    viewHolder.erlaeuterung.setText(clp.getErlaeuterung());
                    ChecklistenPunktStatus status = sparseArray.get(position);
                    if (status == ChecklistenPunktStatus.IN_ORDNUNG) {
                        viewHolder.io.setBackgroundColor(Color.GREEN);
                        viewHolder.io.setEnabled(false);
                        viewHolder.nio.setBackgroundColor(Color.GRAY);
                        viewHolder.nio.setEnabled(true);
                    } else if (status == ChecklistenPunktStatus.NICHT_IN_ORDNUNG) {
                        viewHolder.nio.setBackgroundColor(Color.RED);
                        viewHolder.nio.setEnabled(false);
                        viewHolder.io.setBackgroundColor(Color.GRAY);
                        viewHolder.io.setEnabled(true);
                    } else if (status == ChecklistenPunktStatus.NICHT_SELEKTIERT) {
                        viewHolder.nio.setBackgroundColor(Color.parseColor("#cccccc"));
                        viewHolder.nio.setEnabled(true);
                        viewHolder.io.setBackgroundColor(Color.parseColor("#cccccc"));
                        viewHolder.io.setEnabled(true);
                    }
                    break;
                }
                case Util.CHECKLISTE_UEBERSCHRIFT: {
                    viewHolder.headline.setText(clp.getHeadline());
                    viewHolder.headnummer.setText(clp.getNummer());
                    break;
                }
                case Util.CHECKLISTE_ZUSATZTEXT: {
                    viewHolder.text.setText(Html.fromHtml(clp.getZusatz()));
                    viewHolder.textnummer.setText(clp.getNummer());
                    break;
                }
                default:
                    throw new IllegalArgumentException("ViewType " + type + " unbekannt!");
            }
        }
        return v;
    }

    public SparseArray<ChecklistenPunktStatus> getSparseArray() {
        return sparseArray;
    }

    static class ViewHolder {
        protected TextView nummer;
        protected TextView komponente;
        protected TextView kriterium;
        protected TextView funktion;
        protected TextView erlaeuterung;
        protected TextView text;
        protected TextView textnummer;
        protected TextView headline;
        protected TextView headnummer;
        protected Button io;
        protected Button nio;
    }
}

编辑:

convertView为null时,我通过扩大布局来创建新的View 然后创建一个新的ViewHolder ,根据Views viewType查找不同的TextViewsButtons并将它们放入ViewHolder 之后,我将此ViewHolder设置为View的标签。 我根据区分viewType再次设定内部意见的文本和听众ViewHolder 然后我返回视图。

convertView不为null时,我将重用View。 我使用getTag()方法获取ViewHolder ,根据模型类设置文本和Button状态,并在方法末尾返回视图。

我的问题是应答状态已正确保存在SparseArray ,但未正确显示。 当我在列表的第一行中回答问题然后向下滚动时,已回答的问题出现在列表末尾。 通过上下滚动,我可以完全弄乱应答状态。 但是,尽管发生这种情况,sparseArray中的状态始终是正确的。

我在这里想念什么吗?

我想代码有问题。 当您使用相同的单元格并且视图不为null时,您应该重用相同的所有者,而不是convertView。 像这样:

ViewHolder viewHolder = new ViewHolder();
if (convertView == null) {
    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    .
    .
    .
} 
else {
    viewHolder = convertView.getTag();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM