我有一個從SimpleCursorAdapter擴展的自定義適配器。使用這個我綁定一個ListView,它包含一個複選框和兩個文本框。打開活動時,列表顯示正常。但是,點擊複選框並在文本框中輸入一些文本並向下滾動,然後再次上移,數據就會消失。值從滾動列表視圖中消失 - Android
實際上,任何更改都會消失,即使它們已被檢查。我取消選中它們,然後向下滾動,返回查看。所以基本上,他們迴歸到任何狀態。
任何想法爲什麼?謝謝。
我有一個從SimpleCursorAdapter擴展的自定義適配器。使用這個我綁定一個ListView,它包含一個複選框和兩個文本框。打開活動時,列表顯示正常。但是,點擊複選框並在文本框中輸入一些文本並向下滾動,然後再次上移,數據就會消失。值從滾動列表視圖中消失 - Android
實際上,任何更改都會消失,即使它們已被檢查。我取消選中它們,然後向下滾動,返回查看。所以基本上,他們迴歸到任何狀態。
任何想法爲什麼?謝謝。
您需要在列表中包含每個項目狀態的列表列表,然後每次加載列表項目視圖時加載這些狀態。通過重寫適配器中的GetView()方法並添加保存的狀態到基於物品位置的列表
Android不會同時呈現所有ListView
條目,但只會顯示在屏幕上可見的條目。當「新」目錄-行映入眼簾的Adapter
的
public View getView(int position, View convertView, ViewGroup parent)
方法被調用和視圖重建。 要填寫先前保存的值,您必須覆蓋getView
方法。
如果除了解釋之外還會有一些有用的代碼 – Sam 2017-02-14 18:25:52
每次列表向上滾動或向下滾動時,ListView都會重新創建其視圖。您需要有某種模型類,可以將複選框和文本框的狀態保存在內存中,以防某些更改完成(針對該特定行),並稍後將其顯示在視圖上。
正如在這篇文章中的其他答案中提到的,你可以使用getview以編程方式將基於列表視圖位置的值存儲在模型類中。
像這樣的事情
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("getView " + position + " " + convertView);
ViewHolder holder = null;
if (convertView == null)
{
convertView = mInflater.inflate(R.layout.item1, null);
holder = new ViewHolder();
holder.textView = (TextView)convertView.findViewById(R.id.text);
convertView.setTag(holder);
}
else {
holder = (ViewHolder)convertView.getTag();
}
// Pass on the value to your text view like this. You can do it similarly for a check box as well
holder.textView.setText(mData.get(position));
return convertView;
}
我覺得Android是回收看法,並不保存狀態。也許有一些處理程序,你可以保存更改的值 – Fender 2011-05-19 11:12:37
有關ListView不保持其行視圖狀態的問題在這裏經常被問到,我敢打賭,你會發現幾個很容易。我發現[這一個](http://stackoverflow.com/questions/2937581/android-how-to-make-radiogroup-work-correctly-in-a-listview)特別有用。 – compostus 2011-05-19 11:28:09