1

我正在使用viewHolder和getview在listvew中開發checkedtextview。從數據庫填充檢查/取消選中狀態綁定運行良好。但是,如果我檢查項目,然後滾動listview,它會回到取消選中。Checkedtextview check /取消選中後滾動Listview

這是我的customAdapter代碼。

public class CustomAdapter extends ArrayAdapter<Model> { 
private Activity activity; 
int id; 
String autoid; 
ArrayList<Model> items; 
DatabaseHelper dbhelper = new DatabaseHelper(getContext()); 

public CustomAdapter(Activity context, int resource, ArrayList<Model> obj) { 
    super(context, resource, obj); 

    this.activity = context; 
    this.id = resource; 
    this.items = obj; 

    try { 
     dbhelper.openDatabase(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 



static class ViewHolder { 
    protected CheckedTextView textView; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder vh = null; 

    if (convertView == null) { 

     LayoutInflater inflater = activity.getLayoutInflater(); 
     convertView = inflater.inflate(id, null); 
     vh = new ViewHolder(); 
     convertView.setTag(vh); 

     vh.textView = (CheckedTextView) convertView.findViewById(R.id.textbox1); 

    } 
    else 
    { 
     vh = (ViewHolder) convertView.getTag(); 

    } 

    final Model item = items.get(position); 
    String status = item.getStatus(); 

    final Model check = getItem(position); 

    final ViewHolder finalVh = vh; 

    vh.textView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      autoid = item.getAutoid(); 

      if (! finalVh.textView.isChecked()) { 
       finalVh.textView.setChecked(true); 
      } 
      else 
      { 
       finalVh.textView.setChecked(false); 
      } 
     } 
    }); 

    vh.textView.setText(item.getDate() +". "+item.getInfo()); 
    vh.textView.setChecked(Boolean.parseBoolean(status)); 

    return convertView; 
}} 

在此先感謝。

回答

2

那是因爲您傳遞的列表(項目)具有舊值。當您更改檢查狀態時,將其更新爲填充到listview的列表(項目)。滾動列表視圖將加載它們的項目再次,它在哪裏獲得舊價值。

vh.textView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     autoid = item.getAutoid(); 

     if (! finalVh.textView.isChecked()) { 
      finalVh.textView.setChecked(true); 
      item.setStatus("true") 
     } else { 
      finalVh.textView.setChecked(false); 
      item.setStatus("false"); 
     } 
     items.set(position, item); 
    } 
}); 
+0

超,所以基本上滾動listview會加載適配器還是怎麼樣? –

+0

listview只是一次加載屏幕上的項目。當你開始滾動時,它會加載新的項目並丟棄舊的項目。然後當我們再次滾動時,它會從你提供給它的列表中加載項目 –

+0

這條線從哪裏來? 'item.getAutoid();' – grant

0

這是因爲你的ViewHolder被重用,在ListView你沒有在列表中的相同的實例號ViewHolder和元素,您有大約顯示的項目的數量。

要解決它,如果一個項目在布爾列表(您的項目列表的大小相同)檢查您可以存儲在您的getView設置你的項目檢查,如果在相同的位置的布爾是真實的。