2017-09-19 7 views
0

ボタンビューの可視性はonClickを変更するはずですが、ビューをリサイクルすると、そのビューはnullになります。次の項目の可視性の状態が以前の一覧と異なる場合に表示されます。関連するJavaは次のとおりです。リストビューの項目の子がnullになるp.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(); 

以下は、設定しようとしているときに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

問題は2つの異なるレイアウトを使用していることです。ビューがリサイクルされると、それは2つのいずれかになる可能性があり、どちらを取得するかわからないことがあります。 convertViewがnullでない場合、ビューを拡張するコードはスキップされます。したがって、NPEです。

良いニュースは、BaseAdapterクラスでこれを解決する簡単な方法があることです。

アダプターでオーバーライドする必要がある方法は、getItemViewTypegetViewTypeCountです。

これは、あなたのアダプターが、ヌルビューをリサイクルするためにどの方法であなたのgetViewメソッドに渡すかを知るのに役立ちます。

+1

解決済み!bool "hostListItemView"によってアクティブなビュータイプを監視しようとしましたが、ビューがリサイクルされても変更されませんでした。使用されたgetItemViewTypeとそれは完全に機能しました!ありがとう – sleethma

関連する問題