2011-05-19 48 views
2

我有一個從SimpleCursorAdapter擴展的自定義適配器。使用這個我綁定一個ListView,它包含一個複選框和兩個文本框。打開活動時,列表顯示正常。但是,點擊複選框並在文本框中輸入一些文本並向下滾動,然後再次上移,數據就會消失。值從滾動列表視圖中消失 - Android

實際上,任何更改都會消失,即使它們已被檢查。我取消選中它們,然後向下滾動,返回查看。所以基本上,他們迴歸到任何狀態。

任何想法爲什麼?謝謝。

+1

我覺得Android是回收看法,並不保存狀態。也許有一些處理程序,你可以保存更改的值 – Fender 2011-05-19 11:12:37

+1

有關ListView不保持其行視圖狀態的問題在這裏經常被問到,我敢打賭,你會發現幾個很容易。我發現[這一個](http://stackoverflow.com/questions/2937581/android-how-to-make-radiogroup-work-correctly-in-a-listview)特別有用。 – compostus 2011-05-19 11:28:09

回答

4

您需要在列表中包含每個項目狀態的列表列表,然後每次加載列表項目視圖時加載這些狀態。通過重寫適配器中的GetView()方法並添加保存的狀態到基於物品位置的列表

0

Android不會同時呈現所有ListView條目,但只會顯示在屏幕上可見的條目。當「新」目錄-行映入眼簾的Adapter

public View getView(int position, View convertView, ViewGroup parent) 

方法被調用和視圖重建。 要填寫先前保存的值,您必須覆蓋getView方法。

+0

如果除了解釋之外還會有一些有用的代碼 – Sam 2017-02-14 18:25:52

2

每次列表向上滾動或向下滾動時,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; 
     }