1

Я разрабатываю checktextview в listvew, используя viewHolder и getview. Для заполнения проверки/снятия привязки статуса из базы данных работает хорошо. Но, если я проверю элемент, а затем прокрутку списка, он вернется, чтобы снять отметку.Checkedtextview check/uncheck после прокрутки 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.On Прокрутите список, чтобы загрузить их элементы снова, где он получает старую ценность.

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 задан ваш элемент, чтобы проверить, является ли логическое значение в том же положении истинным.

Смежные вопросы