Checkbox не установлен, когда я просматриваю список на Android

Я новичок в разработке Android. Я создал список с textbox и checkbox .

Когда я устанавливаю checkbox и прокручиваю его, чтобы проверить некоторые другие элементы в представлении списка, более старые неконтролируемые.

Как избежать этой проблемы в listview ? Прошу вас, указав мой код.

Вот код:

main.xml:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/TextView01" android:layout_height="wrap_content" android:text="List of items" android:textStyle="normal|bold" android:gravity="center_vertical|center_horizontal" android:layout_width="fill_parent"/> <ListView android:id="@+id/ListView01" android:layout_height="250px" android:layout_width="fill_parent"/> <Button android:text="Save" android:id="@+id/btnSave" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> 

Это страница XML, которую я использовал для создания динамической строки списка:

listview.xml:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:gravity="left|center" android:layout_width="wrap_content" android:paddingBottom="5px" android:paddingTop="5px" android:paddingLeft="5px"> <TextView android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:textColor="#FFFF00" android:text="hi"/> <TextView android:text="hello" android:id="@+id/TextView02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10px" android:textColor="#0099CC"/> <EditText android:id="@+id/txtbox" android:layout_width="120px" android:layout_height="wrap_content" android:textSize="12sp" android:layout_x="211px" android:layout_y="13px"/> <CheckBox android:id="@+id/chkbox1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> 

Это мой класс активности.

CustomListViewActivity.java:

 public class CustomListViewActivity extends Activity { ListView lstView; static Context mContext; Button btnSave; private static class EfficientAdapter extends BaseAdapter { private LayoutInflater mInflater; public EfficientAdapter(Context context) { mInflater = LayoutInflater.from(context); } public int getCount() { return country.length; } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.listview, parent, false); holder = new ViewHolder(); holder.text = (TextView) convertView .findViewById(R.id.TextView01); holder.text2 = (TextView) convertView .findViewById(R.id.TextView02); holder.txt = (EditText) convertView.findViewById(R.id.txtbox); holder.cbox = (CheckBox) convertView.findViewById(R.id.chkbox1); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.text.setText(curr[position]); holder.text2.setText(country[position]); holder.txt.setText(""); holder.cbox.setChecked(false); return convertView; } public class ViewHolder { TextView text; TextView text2; EditText txt; CheckBox cbox; } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); lstView = (ListView) findViewById(R.id.ListView01); lstView.setAdapter(new EfficientAdapter(this)); btnSave = (Button)findViewById(R.id.btnSave); mContext = this; btnSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // I want to print the text which is in the listview one by one. // Later I will insert it in the database. // // Toast.makeText(getBaseContext(), "EditText Value, checkbox value and other values", Toast.LENGTH_SHORT).show(); for (int i = 0; i < lstView.getCount(); i++) { View listOrderView; listOrderView = lstView.getChildAt(i); try{ EditText txtAmt = (EditText)listOrderView.findViewById(R.id.txtbox); CheckBox cbValue = (CheckBox)listOrderView.findViewById(R.id.chkbox1); if(cbValue.isChecked()== true){ String amt = txtAmt.getText().toString(); Toast.makeText(getBaseContext(), "Amount is :"+amt, Toast.LENGTH_SHORT).show(); } } catch (Exception e) { // TODO: handle exception } } } }); } private static final String[] country = { "item1", "item2", "item3", "item4", "item5", "item6","item7", "item8", "item9", "item10", "item11", "item12" }; private static final String[] curr = { "1", "2", "3", "4", "5", "6","7", "8", "9", "10", "11", "12" }; } 

Пожалуйста, помогите мне решить эту проблему.

Я упоминал эту проблему во многих местах. Но я не мог получить правильный ответ для решения этой проблемы.

Пожалуйста, предоставьте мне код, чтобы не снимать флажок при прокрутке вверх и вниз.

В пользовательском интерфейсе listview вызов setChecked после вызова setOnCheckedChangeListener .

Таким образом, вы разорвете ссылку на старого слушателя из переработанного представления.

В вашем getView() вас есть следующая строка

 holder.cbox.setChecked(false); 

getView() CheckBox каждый раз, когда getView() (например, при прокрутке списка)

Вы можете использовать следующий код адаптера для правильной установки флажка в ListView.

Подробное демо здесь: Listview With Checkbox Android

См. Подробную демонстрационную ссылку для глубокой информации. Он также показывает, как отправить проверенную информацию на следующую активность.

 import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; public class CustomAdapter extends BaseAdapter { private Context context; public static ArrayList<Model> modelArrayList; public CustomAdapter(Context context, ArrayList<Model> modelArrayList) { this.context = context; this.modelArrayList = modelArrayList; } @Override public int getViewTypeCount() { return getCount(); } @Override public int getItemViewType(int position) { return position; } @Override public int getCount() { return modelArrayList.size(); } @Override public Object getItem(int position) { return modelArrayList.get(position); } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.lv_item, null, true); holder.checkBox = (CheckBox) convertView.findViewById(R.id.cb); holder.tvAnimal = (TextView) convertView.findViewById(R.id.animal); convertView.setTag(holder); } else { // The getTag returns the viewHolder object set as a tag to the view holder = (ViewHolder)convertView.getTag(); } holder.checkBox.setText("Checkbox " + position); holder.tvAnimal.setText(modelArrayList.get(position).getAnimal()); holder.checkBox.setChecked(modelArrayList.get(position).getSelected()); holder.checkBox.setTag(R.integer.btnplusview, convertView); holder.checkBox.setTag( position); holder.checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { View tempview = (View) holder.checkBox.getTag(R.integer.btnplusview); TextView tv = (TextView) tempview.findViewById(R.id.animal); Integer pos = (Integer) holder.checkBox.getTag(); Toast.makeText(context, "Checkbox " + pos + " clicked!", Toast.LENGTH_SHORT).show(); if (modelArrayList.get(pos).getSelected()){ modelArrayList.get(pos).setSelected(false); } else { modelArrayList.get(pos).setSelected(true); } } }); return convertView; } private class ViewHolder { protected CheckBox checkBox; private TextView tvAnimal; } } 

Model

 public class Model { private boolean isSelected; private String animal; public String getAnimal() { return animal; } public void setAnimal(String animal) { this.animal = animal; } public boolean getSelected() { return isSelected; } public void setSelected(boolean selected) { isSelected = selected; } } 

Blockquote

** В Side getView () Метод просто назовите это >>

 check.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton arg0, boolean arg1) { if(check.isChecked()) { //checked chkArray[position]=true; } else { //uncheck chkArray[position]=false; } } }); //check condition for checkboxes if(chkArray.length>0) { for (int i = 0; i < chkArray.length; i++) { if(chkArray[position]!=null && chkArray[position]) { check.setChecked(true); } } } 

Рассматривать:

 holder.cbox.setChecked(false); 

Удалите эту строку. Когда вы каждый раз прокручиваете представление списка, вызывается метод getView ().

Когда мы прокручиваем элементы в списке, он восстанавливает значение из адаптера. Вот почему флажок снят. Но если мы обновим адаптер с последним значением, он останется включенным. Для этого вам нужно использовать setOnClickListener ().

Все, что вам нужно сделать, это обновить свой адаптер на флажке. Вы можете сослаться на эту ссылку, чтобы получить представление

Я также получил эту проблему раньше. Android делает это, чтобы сэкономить место; Загружаются только те предметы, которые вы сейчас видите, и это то, что я узнал.

Если вы находитесь внизу в своем списке, идентификатор 1 находится, возможно, на позиции 5. Я искал в Интернете и узнал об этом раньше.

Но это поможет вам: D