0

Je développe une application Android où j'utilise une liste qui a une case à cocher dans chaque élément de la ligne. Mais quand il fait défiler vers le haut ou vers le bas, les lignes aléatoires suppriment les cases à cocher qui se terminent par pas de cases à cocher dans la liste entière. J'ai essayé de nombreuses solutions données dans les tutoriels en ligne, mais aucune d'entre elles ne fonctionne. Tous les montrent en utilisant une classe ViewHolder. Pourrais-tu m'aider s'il te plaît?Comment réparer Android ListView Rendering Error où les cases à cocher des éléments de la liste disparaissent?

Voici tout le code que je peux fournir:

élément de liste XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#FFFFFF" 
    android:orientation="vertical" 
    android:paddingBottom="16dp" 
    android:paddingLeft="16dp" 
    android:paddingRight="16dp"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:layout_gravity="center"> 

     <ImageView 
      android:id="@+id/user_image_view" 
      android:layout_width="56dp" 
      android:layout_height="56dp" 
      android:layout_margin="16dp" 
      tools:src="@mipmap/ic_account_circle_bue" /> 

     <RelativeLayout 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center"> 

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:orientation="vertical" 
       android:paddingRight="16dp" 
       android:layout_centerVertical="true"> 

       <TextView 
        android:id="@+id/user_name" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="Name" 
        android:textSize="19dp" 
        android:textStyle="bold" 
        android:ellipsize="end" 
        android:maxLines="1" 
        android:textColor="#000000" 
        android:paddingRight="5dp"/> 

       <LinearLayout 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:orientation="horizontal"> 

        <TextView 
         android:id="@+id/user_roll_number" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:text="Roll Number" 
         android:textSize="15dp" /> 

        <TextView 
         android:id="@+id/user_department" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:paddingLeft="12dp" 
         android:text="Department" 
         android:textSize="15dp" 
         android:maxLines="1" 
         android:ellipsize="end"/> 

       </LinearLayout> 
      </LinearLayout> 

      <CheckBox 
       android:id="@+id/checkbox" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:gravity="center" 
       android:layout_gravity="center" 
       android:layout_alignParentRight="true" 
       android:layout_centerVertical="true"/> 
     </RelativeLayout> 
    </LinearLayout> 
</LinearLayout> 

UsersSelection (modèle classe):

package com.app.shubhamjhunjhunwala.heritagecompanion_students; 

/** 
* Created by shubham on 09/05/17. 
*/ 

public class UsersSelection { 
    public Users users; 
    public boolean isSelected; 

    public UsersSelection (Users users, boolean isSelected) { 
     this.users = users; 
     this.isSelected = isSelected; 
    } 

    public Users getUsers() { 
     return users; 
    } 

    public void setUsers(Users users) { 
     this.users = users; 
    } 

    public boolean isSelected() { 
     return isSelected; 
    } 

    public void setSelected(boolean selected) { 
     isSelected = selected; 
    } 
} 

Users.java (classe personnalisée):

package com.app.shubhamjhunjhunwala.heritagecompanion_students; 

/** 
* Created by shubham on 23/01/17. 
*/ 

public class Users { 

    String name; 
    String department; 
    String roll; 
    String dpDownloadUri; 

    Users() {} 

    public Users(String name, String department, String roll, String dpDownloadUri) { 
     this.name = name; 
     this.department = department; 
     this.roll = roll; 
     this.dpDownloadUri = dpDownloadUri; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getDepartment() { 
     return department; 
    } 

    public void setDepartment(String department) { 
     this.department = department; 
    } 

    public String getRoll() { 
     return roll; 
    } 

    public void setRoll(String roll) { 
     this.roll = roll; 
    } 

    public String getDpDownloadUri() { 
     return dpDownloadUri; 
    } 

    public void setDpDownloadUri(String dpDownloadUri) { 
     this.dpDownloadUri = dpDownloadUri; 
    } 
} 

C ustom Array Adaptateur pour Affichage liste:

package com.app.shubhamjhunjhunwala.heritagecompanion_students; 

import android.app.Activity; 
import android.content.Context; 
import android.content.SharedPreferences; 
import android.graphics.Bitmap; 
import android.support.v4.graphics.drawable.RoundedBitmapDrawable; 
import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.ImageView; 
import android.widget.TextView; 

import com.bumptech.glide.Glide; 

import java.io.FileNotFoundException; 
import java.util.List; 
import java.util.concurrent.ExecutionException; 

/** 
* Created by shubham on 09/05/17. 
*/ 

public class UsersSelectionAdapter extends ArrayAdapter<UsersSelection> { 
    public Context context; 
    public String roll; 
    public boolean isForGroup; 
    public List<GroupMembers> groupMembersList; 
    public List<UsersSelection> list; 

    public CheckBox checkBox; 

    public UsersSelectionAdapter(Context context, int resource, List<UsersSelection> objects) { 
     super(context, resource, objects); 
     this.context = context; 
     list = objects; 
    } 

    public class ViewHolder { 
     TextView nameTextView; 
     TextView rollNumberTextView; 
     TextView departmentTextView; 
     ImageView dpImageView; 
     CheckBox checkBox; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     SharedPreferences sharedPreferences = ((Activity) getContext()).getSharedPreferences("HCS", 0); 
     roll = sharedPreferences.getString(AuthenticationActivity.ROLL_SHARED_PREFERENCE_KEY, ""); 

     ViewHolder viewHolder = null; 

     if (convertView == null) { 
      convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.user_list_item, parent, false); 

      viewHolder = new ViewHolder(); 

      viewHolder.nameTextView = (TextView) convertView.findViewById(R.id.user_name); 
      viewHolder.departmentTextView = (TextView) convertView.findViewById(R.id.user_department); 
      viewHolder.rollNumberTextView = (TextView) convertView.findViewById(R.id.user_roll_number); 
      viewHolder.dpImageView = (ImageView) convertView.findViewById(R.id.user_image_view); 
      viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox); 

      viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        int getPosition = (int) buttonView.getTag(); 
        list.get(getPosition).setSelected(buttonView.isSelected()); 
       } 
      }); 

      convertView.setTag(viewHolder); 
      convertView.setTag(R.id.user_name, viewHolder.nameTextView); 
      convertView.setTag(R.id.user_department, viewHolder.departmentTextView); 
      convertView.setTag(R.id.user_roll_number, viewHolder.rollNumberTextView); 
      convertView.setTag(R.id.user_image_view, viewHolder.dpImageView); 
      convertView.setTag(R.id.checkbox, viewHolder.checkBox); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     viewHolder.checkBox.setTag(position); 

     /*TextView nameTextView = (TextView) convertView.findViewById(R.id.user_name); 
     TextView departmentTextView = (TextView) convertView.findViewById(R.id.user_department); 
     TextView rollNumberTextView = (TextView) convertView.findViewById(R.id.user_roll_number); 
     ImageView dpImageView = (ImageView) convertView.findViewById(R.id.user_image_view); 
     checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);*/ 

     UsersSelection usersSelection = getItem(position); 
     Users user = usersSelection.getUsers(); 

     if (!isForGroup) { 
      viewHolder.checkBox.setVisibility(View.GONE); 
     } else { 
      if (user.getRoll().equals(roll)) { 
       viewHolder.checkBox.setVisibility(View.GONE); 
      } 
     } 

     viewHolder.nameTextView.setText(user.getName()); 
     viewHolder.nameTextView.setTag(usersSelection); 
     viewHolder.departmentTextView.setText(user.getDepartment()); 
     viewHolder.departmentTextView.setTag(usersSelection); 
     viewHolder.rollNumberTextView.setText(user.getRoll()); 
     viewHolder.rollNumberTextView.setTag(usersSelection); 

     viewHolder.checkBox.setChecked(list.get(position).isSelected()); 
     viewHolder.checkBox.setTag(usersSelection); 

     Bitmap bitmap = null; 

     if (!user.getDpDownloadUri().equals("")) { 

      DPAsyncTask dpAsyncTask = new DPAsyncTask(context, viewHolder.dpImageView.getContext(), viewHolder.dpImageView, user); 
      dpAsyncTask.execute(); 

     } else { 

      Glide.clear(viewHolder.dpImageView); 
      viewHolder.dpImageView.setImageDrawable(getContext().getResources().getDrawable(R.mipmap.ic_account_circle_bue)); 

     } 

     return convertView; 
    } 

    public boolean isForGroup() { 
     return isForGroup; 
    } 

    public void setForGroup(boolean forGroup) { 
     isForGroup = forGroup; 
    } 

    public List<GroupMembers> getGroupMembersList() { 
     return groupMembersList; 
    } 

    public void setGroupMembersList(List<GroupMembers> groupMembersList) { 
     this.groupMembersList = groupMembersList; 
    } 

    public CheckBox getCheckBox() { 
     return checkBox; 
    } 

    public void setCheckBox(CheckBox checkBox) { 
     this.checkBox = checkBox; 
    } 
} 

Merci d'avoir lu mon numéro. Espérons que vous aider :)

Répondre

0
if (!isForGroup) { 
     viewHolder.checkBox.setVisibility(View.GONE); 
    } else { 
     if (user.getRoll().equals(roll)) { 
      viewHolder.checkBox.setVisibility(View.GONE); 
     } 
    } 

Vous ne faites jamais le CheckBoxGONE. Vous ne l'avez jamais réinitialisé pour être VISIBLE. Rappelez-vous que le point derrière ListView, d'autres classes AdapterView et RecyclerView est de recycler les vues. Vous ne pouvez pas, et ne devez pas, supposer que vos widgets sont dans un état particulier dans getView(). Si vous modifiez un widget (par exemple, changez sa visibilité), vous devez modifier cet état tout le temps.

, modifiez le code ci-dessus:

if (!isForGroup || user.getRoll().equals(roll)) { 
     viewHolder.checkBox.setVisibility(View.GONE); 
    } else { 
     viewHolder.checkBox.setVisibility(View.VISIBLE); 
    } 

ou quelque chose comme ça, de sorte que vous toujours indiquer si le CheckBox doit être visible ou non.

+0

Merci. Cela a fonctionné. C'était un sauveur de vie :) –