В моем случае у меня есть два текстовых вида и один флажок в списке. Я использую класс ArrayAdapter для установки данных в текстовых просмотров.
Когда я выбираю любой флажок и прокручиваю в виде списка, некоторые флажки автоматически выбираются. Я не понимаю, почему это происходит ниже, это мой код, пожалуйста, посмотрите код и дайте решение, чтобы решить эту проблему.
public class Contacts_NumberActivity extends Activity {
/** Called when the activity is first created. */
String nameList[] = { "U", "A", "B", "C", "D", "E", "F", "G", "H",
"I", "J", "L", "M", "N", "O", "P", "Q" }, numberList[] = { "1",
"2", "3", "4", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4",
"5", "6", "7" };
ListView contactList;
boolean[] checked;
ContactHolder holder = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
contactList = (ListView) findViewById(R.id.contact_list);
contactList.setAdapter(new ContactAdapter(this, R.layout.list_item,
nameList, numberList));
}
public class ContactAdapter extends ArrayAdapter<String> {
Context context;
int layoutResourceId;
String data[] = null;
String data1[] = null;
public ContactAdapter(Context context, int layoutResourceId,
String[] data, String[] data1) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
this.data1 = data1;
}
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
View row = convertView;
if (row == null) {
LayoutInflater inflater = ((Activity) context)
.getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new ContactHolder();
holder.name = (TextView) row.findViewById(R.id.name);
holder.number = (TextView) row.findViewById(R.id.number);
holder.chkbox = (CheckBox) row.findViewById(R.id.checkBox1);
holder.chkbox
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(
CompoundButton buttonView, boolean isChecked) {
holder.chkbox.setChecked(isChecked);
System.out.println("Checked possition= "
+ isChecked);
}
});
row.setTag(holder);
} else {
holder = (ContactHolder) row.getTag();
}
holder.name.setText(data[position]);
holder.number.setText(data1[position]);
return row;
}
public class ContactHolder {
TextView name, number;
CheckBox chkbox;
}
}
}
ваш код не имеет проблем, но проблема связана с функцией ArrayAdapter getView, которая вызывает способ повторной инициализации и повторного использования несфокусированных строк списка для того, что вы используете для проверки просмотра конверсий, которая вызывает пейджинг, как если бы вы сначала проверяли флажок то все экраны в пейджинге проверяют первый флажок,
чтобы получить разрешение от этого, вы должны использовать макет вместо представления списка с помощью адаптера, здесь подсказка может помочь вам
LinearLayout parent = new LinearLayout(this);
parent.setOrientation(VERTICAL);
parent.setLayoutParams(new LayoutParams(list_width,list_height);
for(number of rows in your list)
{
LinearLayout row= new LinearLayout(this);
row.setOrientation(Horizontal);
row.setLayoutParams(new LayoutParams(row_width,row_height);
TextView text= new TextView (this);
text.setText("your text");
text.setLayoutParams(new LayoutParams(text_width,text_height);
row.addView(text);
.
.//other view you want to add as check box etc
.
.
parent.AddView(row);
}
this.addView(parent);
hope this will help you
примечание: но в случае, если у вас большое количество строк, это может вызвать проблемы с памятью