CheckBox est désactivé pour défiler dans une liste de favoris personnalisée

Je sais que cette question a été posée à maintes reprises, mais je n'ai toujours pas pu trouver une suggestion qui m'a vraiment aidé. La case à cocher est désactivée chaque fois que la liste est défilée. Oui, j'utilise un tableau booléen pour stocker les valeurs mais cela ne corrige toujours pas le problème. Voici mon code. Veuillez suggérer une solution pour cela. Je vous remercie.

public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub final ViewHolder holder; final boolean[] itemChecked=new boolean[30]; LayoutInflater inflater = context.getLayoutInflater(); if(convertView==null) { convertView = inflater.inflate(R.layout.custom_list, null); holder = new ViewHolder(); holder.txtViewTitle = (TextView) convertView.findViewById(R.id.title_text); holder.txtViewDescription = (TextView) convertView.findViewById(R.id.description_text); holder.cb=(CheckBox) convertView.findViewById(R.id.cb); convertView.setTag(holder); } else { holder=(ViewHolder)convertView.getTag(); } holder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub itemChecked[position] = isChecked; if(itemChecked[position]) { holder.cb.setChecked(true); } else { holder.cb.setChecked(false); } holder.txtViewTitle.setText(title[position]); holder.txtViewDescription.setText(description[position]); holder.cb.setChecked(itemChecked[position]); holder.txtViewDescription.setFocusable(false); holder.txtViewTitle.setFocusable(false); return convertView; } } 

  • RecyclerView scrollToPosition pas déclencher scrollListener
  • Ressources Android $ NotFoundException
  • MyGestureDetector étend SimpleOnGestureListener
  • Retrofit conserve l'oubli de mes cookies 🙁 Android
  • Suppression des extras de l'intention passée
  • Appareil photo Android: Résultat de livraison de défaut ResultInfo {who = null, request = 0, result = -1, data = null} to activity
  • L'évolution de l'état de ToggleButton est programmée plutôt que automatiquement dans Android?
  • Android PopupWindow et WRAP_CONTENT ne fonctionnent pas ensemble
  • AppCompat v7: 21 Split Action Bar Broken?
  • Les attributs XML ColorControlNormal de xml ne fonctionnent pas avant Lollipop
  • ListView ou TableLayout?
  • Navigation Afficher les éléments du menu avec le compteur à droite
  • 3 Solutions collect form web for “CheckBox est désactivé pour défiler dans une liste de favoris personnalisée”

    GetView () est appelé chaque fois qu'un élément de liste précédemment invisible doit être dessiné. Puisque vous recrée itemChecked[] chaque fois que cette méthode est appelée, vous aurez la nouvelle case à cocher désactivée et une matrice différente pour chaque vue résultante. (Le final en Java ne rend pas ce champ unique comme en C) Le moyen le plus simple de résoudre c'est l' itemChecked un état de classmember et set / restore checkbox basé sur celui-ci.

     public class MyListAdapter extends ArrayAdapter<Object> { private final boolean[] mCheckedState; private final Context mContext; public MyListAdapter(Context context, int resource, int textViewResourceId, List<Object> objects) { super(context, resource, textViewResourceId, objects); mCheckedState = new boolean[objects.size()]; mContext = context; } @Override public View getView(int position, View convertView, ViewGroup parent) { // simplified to just a Checkbox // ViewHolder and OnCheckedChangeListener stuff left out CheckBox result = (CheckBox)convertView; if (result == null) { result = new CheckBox(mContext); } result.setChecked(mCheckedState[position]); return result; } } 

    Voici un exemple. Lisez les commentaires dans le getView (…) de l'adaptateur fourni ci-dessous.


     class TaskObject { private int pid; private String processName; private boolean toKill; ///getters/setters public boolean isToKill() { return toKill; } public void setToKill(boolean toKill) { this.toKill = toKill; } ................................ } 

     class TaskListAdapter extends BaseAdapter { private static final String TAG = "adapter"; ArrayList<TaskObject> list; Context context; public TaskListAdapter(Context context) { Log.d(TAG, "created new task list adapter"); this.context = context; if (list == null) { list = new ArrayList<TaskObject>(); } } public void addTask(TaskObject taskObject) { list.add(taskObject); } public void clearTasks() { list.clear(); Log.d(TAG, "list size:" + list.size()); this.notifyDataSetChanged(); } public int getCount() { return list.size(); } public TaskObject getItem(int position) { return list.get(position); } public long getItemId(int position) { return position; } public View getView(final int position, View convertView, ViewGroup parent) { RelativeLayout rl = new RelativeLayout(context); TextView textPid = new TextView(context); textPid.setText(Integer.toString(getItem(position).getPid())); TextView textName = new TextView(context); textName.setText(getItem(position).getProcessName()); /////Here is your and it will set back your checked item after scroll CheckBox chckKill = new CheckBox(context); if(getItem(position).isToKill()) { chckKill.setChecked(true); } //////////////////////////////////////////////////////////////////// chckKill.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //is chkIos checked? if (((CheckBox) v).isChecked()) { getItem(position).setToKill(true); } } }); chckKill.setTag(getItem(position).getPid()); /////////NOT LAYOUTED USE LAYOUT rl.addView(chckKill); rl.addView(textName); rl.addView(textPid); return rl; } 

    J'espère que cela aide abit.

    Dans mon cas, j'ai résolu cette question comme suit:

     @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder = null; TextView title = null; ImageView thumbnail = null; CheckBox checkBox = null; Content rowData = GridViewActivity.contents.get(position); if (null == convertView) { convertView = mInflater.inflate(R.layout.grid_item, null); holder = new ViewHolder(convertView); convertView.setTag(holder); } holder = (ViewHolder) convertView.getTag(); title = holder.getContentTitle(); title.setText(rowData.getTitle()); thumbnail = holder.getThumbnail(); thumbnail.setImageResource(rowData.getIcon()); checkBox = holder.getCheckBox(); checkBox.setTag(position); checkBox.setChecked(rowData.isCheckBox()); checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { int getPosition = (Integer) buttonView.getTag(); GridViewActivity.notifyCheckChanges(getPosition, buttonView.isChecked()); } }); return convertView; } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.