1

viewHolderとgetviewを使用してlistviewwでcheckedtextviewを開発しています。チェックボックスをオンにする/チェックボックスをオフにすると、データベースからのバインドが正常に実行されています。しかし、アイテムをチェックしてからリストビューをスクロールすると、チェックボックスがオフに戻ります。CheckedTextviewスクロールリストビューのチェック/アンチェック

ここは私の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

あなたが渡したリスト(アイテム)は古い値です。チェックステータスを変更すると、リストビューに入力されたリスト(アイテム)に更新されます。リストビューをスクロールするとアイテムがロードされますここでも古い価値が得られています。あなたのViewHolderが再利用されるので、これがある

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

スーパーですので、基本的にはスクロールリストビューでアダプタをロードしますか? –

+0

listviewは、一度に画面上にある項目をロードするだけです。スクロールを開始すると、新しい項目がロードされ、古い項目が失われます。スクロールして戻ると、指定した項目のアイテムが再びロードされます。 –

+0

この行はどこから来ますか? 'item.getAutoid();' – grant

0

、リスト内の同じインスタンス番号ViewHolderと要素を持っていないリストビューでは、あなたは約アイテムの数が表示されています。

これを修正するには、アイテムがブール値リスト(アイテムリストの同じサイズ)でチェックされていて、getViewで同じ位置のブール値が真である場合にチェックするアイテムを設定します。

関連する問題