2017-09-19 9 views
0

버튼보기 가시성은 onClick을 변경해야하지만보기를 재활용하면보기가 null이됩니다. 다음 항목 표시 상태가 이전 목록과 다른 경우입니다. Java 관련성이 있습니다 :listview 목록 항목의 자식이 null이됩니다. 보기를 재활용 할 때

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(); 

다음은 설정하려고 시도 할 때 NPE를 던졌습니다! "pendingRequest1"단추 선형 레이아웃보기가 채워진 앞선보기와 다른 상태에있는 경우에만 발생합니다. 제발 ... 통찰력 좀!

 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; 
} 

답변

0

두 개의 다른 레이아웃을 사용하고 있습니다. 보기가 재활용되면 두 가지 중 하나가 될 가능성이 있으며 어떤 것을 얻을지 모릅니다. convertView가 null이 아니므로 뷰를 부 풀리는 코드는 건너 뜁니다. 따라서 NPE입니다.

좋은 소식은 BaseAdapter 클래스와이 문제를 해결하는 간단한 방법이 있다는 것입니다.

당신이 당신의 어댑터를 오버라이드 (override) 할 필요가있는 방법은 getItemViewTypegetViewTypeCount 있습니다.

이 어댑터를 도움이 될 것입니다

getView 방법으로 재활용 아무도 널 의견을 전달하는 방법을 알고있다.

+1

가 해결! .. 내가 부울 "hostListItemView"하지만 전망 재활용 때 변경하지 않았다하여 활성 viewType을 모니터링하는 노력! 사용 된 getItemViewType과 완벽하게 작동했습니다! 감사 – sleethma