2017-09-19 7 views
0

La visibilité des vues de bouton est censée changer onClick, mais lorsque la vue est recyclée, la vue affichée est nulle. Semble être lorsque l'état de la visibilité de l'élément suivant est différent de sa précédente dans la liste. Voici Java pertinent:enfant dans l'élément de liste listview devient null p.e. lorsque la vue est recyclée

class OpenChavrutaAdapter extends ArrayAdapter<HostSessionData> { 


private Context mContext; 
private static final String LOG_TAG = 
OpenChavrutaAdapter.class.getSimpleName(); 
HostSessionData hostSessionItemData; 

public OpenChavrutaAdapter(Context context, ArrayList<HostSessionData> 
hostSessionArrayList) { 
    super(context, 0, hostSessionArrayList); 
    this.mContext = context; 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    //get data item for position 
    final ViewHolder viewHolder; 
    View listItemView = convertView; 
    Boolean hostListItemView = true; 
    String userId = UserDetails.getmUserId(); 
    final HostSessionData hostLookup = getItem(position); 
    final String hostId = hostLookup.getmHostId(); 


    if (listItemView == null) { 
     viewHolder = new ViewHolder(); 

     //sets correct listItemView based on Caller's Context 
     if (hostId.equals(userId) && mContext == mainActivityContext) { 
      hostListItemView = true; 
      listItemView = 
LayoutInflater.from(
getContext()).inflate(R.layout.hosting_chavrutas_list_item, parent, false); 

} else { 
    //adapter called from HostSelect.class 
    listItemView = 
LayoutInflater.from(getContext()).inflate(R.layout.open_host_list_item, 
parent, false); 
    hostListItemView = false; 
}   
//cache the viewHoslder object inside the fresh view 
     listItemView.setTag(viewHolder); 

    } else { 
     //view is already been populated 
     hostListItemView = false; 
     viewHolder = (ViewHolder) listItemView.getTag(); 
    } 
    final HostSessionData hostSessionDatas = getItem(position); 

    if (hostListItemView) { 
     String idOfConfirmedUser = hostLookup.getmConfirmed(); 
     String request1NullCheck = hostLookup.getMchavrutaRequest1(); 
     String request2NullCheck = hostLookup.getMchavrutaRequest2(); 
     String request3NullCheck = hostLookup.getMchavrutaRequest3(); 

Ci-dessous est lorsque NPE lance en essayant de définirVisibility !! Cela ne semble se produire que lorsque la vue linéaire du bouton "pendingRequest1" est dans un état différent de celui de la vue précédente qui est remplie. S'il vous plaît ... un aperçu!

 if (request1NullCheck != null && 
hostLookup.getMchavrutaRequest1().length() > 5) { 
      String chavrutaRequestIdOne = hostLookup.getMchavrutaRequest1(); 
      viewHolder.pendingRequest_1.setVisibility(View.VISIBLE); 

      if(idOfConfirmedUser.equals(chavrutaRequestIdOne)){ 
viewHolder.confirmRequest_1.setBackgroundColor(Color.parseColor("#10ef2e")); 
      } 
     }else{viewHolder.pendingRequest_1.setVisibility(View.GONE);} 
     notifyDataSetChanged(); 
    } 
    return listItemView; 
} 

Répondre

0

Le problème est que vous utilisez deux dispositions différentes. Lorsque la vue est recyclée, il est possible qu'elle soit l'une des deux et vous ne savez pas laquelle vous obtiendrez. Le code qui gonfle la vue est ignoré lorsque convertView n'est pas null, d'où le NPE. La bonne nouvelle est qu'il existe un moyen simple de résoudre ce problème avec la classe BaseAdapter. Les méthodes que vous devez remplacer dans votre adaptateur sont getItemViewType et getViewTypeCount.

Cela aidera votre adaptateur à savoir comment ne transmettre aucune vue nulle pour recyclage à votre méthode getView.

+1

Résolu! .. J'ai essayé de surveiller le viewType actif par le bool "hostListItemView" mais cela n'a pas changé lorsque les vues ont été recyclées! Utilisé getItemViewType et qui a parfaitement fonctionné! Merci – sleethma