Позиция просмотра списка меняется при прокрутке на андроиде

У меня есть просмотр списка [text view и checkbox controlls] с большим количеством данных. Я выберу элемент из списка и покажу выбранные элементы в следующем действии. Моя проблема заключается в том, что для примера, если я выберу 20-й и 25-й позиции в представлении списка, он отобразит некоторые другие элементы в следующем действии. То есть позиция просмотра списка меняется при прокрутке.

Я выбираю элемент, установив флажок в элементе. В checkbox.setOnChanged listener я написал код, для которого выбрана позиция или нет. Если я выберу 25-й элемент и прокручу представление списка, вызывается метод getview и метод checkbox.setonChanged изменяет выбранную позицию. Я окончательно распечатаю logcat.

Мой формат кодирования:

public class ListContact extends ListActivity { public void onCreate(Bundle icicle){ ..... ArrayAdapter<Model> adapter = new MyCustomArrayAdapter(this,getModel()); setListAdapter(adapter); } .... private List<Model> getModel() { List<Model> list = new ArrayList<Model>(); Iterator<String> itr = constant.selectname.iterator(); while (itr.hasNext()) { list.add(get(itr.next().toString())); } return list; } private Model get(String s) { return new Model(s); } } 

MyCustomArrayAdapter.java:

 public class MyCustomArrayAdapter extends ArrayAdapter<Model> { private final List<Model> list; private final Activity context; constant con ; public MyCustomArrayAdapter(Activity context, List<Model> list) { super(context, R.layout.list_layout, list); this.context = context; this.list = list; } static class ViewHolder { protected TextView text; protected CheckBox checkbox; } @Override public View getView(final int position, View convertView, ViewGroup parent) { // Log.e("getview", "getview"); View view = null; if (convertView == null) { LayoutInflater inflator = context.getLayoutInflater(); view = inflator.inflate(R.layout.list_layout, null); final ViewHolder viewHolder = new ViewHolder(); viewHolder.text = (TextView) view.findViewById(R.id.label); viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check); viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { // con = new constant(); Model element = (Model) viewHolder.checkbox.getTag(); element.setSelected(buttonView.isChecked()); // Log.e("MyCustomArrayAdapter.java", "selectpos array list length"+constant.selectpos.size()); if(isChecked==true){ Log.e("check box value and position ", element.getName()); Log.e("position", ""+position); con.selectpos.set(position, 1); } else{ Log.e("position unselect", ""+position +"---------"+ element.getName()); con.selectpos.set(position, 0); } } }); view.setTag(viewHolder); viewHolder.checkbox.setTag(list.get(position)); } else { view = convertView; ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); } ViewHolder holder = (ViewHolder) view.getTag(); holder.text.setText(list.get(position).getName()); holder.checkbox.setChecked(list.get(position).isSelected()); return view; } } 

Результат logcat:

 02-08 10:44:28.142: E/check box value and position(293): AAAA Qqq 02-08 10:44:28.142: E/check box value and position(293): Mobile-123 02-08 10:44:28.152: E/position(293): 0 **after scrolling the list view some other item print 0th position unselected and wrong data:** 02-08 10:44:31.962: E/position unselect(293): 0---------F212 02-08 10:44:31.962: E/position unselect(293): Home-232 

Я решил проблему. Я добавляю

  View view = null; convertView = null; //in the get view and comments the else part of if (convertView == null) { } /*else{ } */ 

Я бы рекомендовал вам переделать ваш getView таким образом. Это помогло мне.

  @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder =null; // Log.e("getview", "getview"); View view = null; if (convertView == null) { LayoutInflater inflator = context.getLayoutInflater(); view = inflator.inflate(R.layout.list_layout, null); holder =(ViewHolder) view.getTag(); viewHolder.text = (TextView) view.findViewById(R.id.label); viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check); view.setTag(viewHolder); } else { view = convertView; ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); } viewHolder.checkbox.setTag(list.get(position)); holder.text.setText(list.get(position).getName()); holder.checkbox.setChecked(list.get(position).isSelected()); viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { // con = new constant(); Model element = (Model) viewHolder.checkbox.getTag(); element.setSelected(buttonView.isChecked()); // Log.e("MyCustomArrayAdapter.java", "selectpos array list length"+constant.selectpos.size()); if(isChecked==true){ Log.e("check box value and position ", element.getName()); Log.e("position", ""+position); con.selectpos.set(position, 1); } else{ Log.e("position unselect", ""+position +"---------"+ element.getName()); con.selectpos.set(position, 0); } } }); return view; } } 

Измените это в своем классе адаптера

 View view = null; 

в

 View view = convertView;