2017-02-28 4 views
1

ich die beigefügte Klasse in viewholder Patern bin mit meinem Artikel zu instanziiert und Wiederverwendung sehen jedes Mal, wenn ich versuche Woth AdapterAndroid ArrayAdapter viewHolder Muster giiving null Ansichten

sowieso, wenn die Ansicht Text auf bestimmten Wert zu setzen versuchte zu arbeiten stürzt zu geben, dass die Ansicht

public class SpinnerServicesAdapter extends ArrayAdapter<MyService> { 
private LayoutInflater inflater; 
private Context mContext; 
private ArrayList<MyService> services; 
private String headerTxt; 

public SpinnerServicesAdapter(Context mContext, int textViewResourceId, ArrayList services, String headerTxt) { 
    super(mContext, textViewResourceId, services); 
    this.mContext = mContext; 
    this.services = services; 
    this.headerTxt = headerTxt; 
    inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public View getDropDownView(int position, View convertView, ViewGroup parent) { 
    return getCustomView(position, convertView, parent); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    return getCustomView(position, convertView, parent); 
} 
public View getCustomView(int position, View convertView, ViewGroup parent) { 
    SpinnerViewHolder spinnerViewHolder; 

    if (convertView == null) { 
     if (position == 0) { 
      convertView = inflater.inflate(R.layout.spinner_header_item_two, parent, false); 
     } else { 
      convertView = inflater.inflate(R.layout.spinner_item_two, parent, false); 
     } 
     spinnerViewHolder = new SpinnerViewHolder(convertView); 
     convertView.setTag(spinnerViewHolder); 
    } else { 
     spinnerViewHolder = (SpinnerViewHolder) convertView.getTag(); 
    } 

    if (position == 0) { 
     spinnerViewHolder.txtVue.setText(headerTxt); 
    } else { 
     spinnerViewHolder.txtVue.setText(services.get(position).getName_en()); 
    } 

    return convertView; 
} 

class SpinnerViewHolder { 
    TextView txtVue; 
    public SpinnerViewHolder(View v) { 
     txtVue = (TextView) v.findViewById(R.id.spinner_item_two); 
    } 
} 

}

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference 
    at com.infovas.hanger.adapters.SpinnerServicesAdapter.getCustomView(SpinnerServicesAdapter.java:60) 
    at com.infovas.hanger.adapters.SpinnerServicesAdapter.getView(SpinnerServicesAdapter.java:42) 
    at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:197) 
    at android.widget.Spinner.onMeasure(Spinner.java:507) 
    at android.support.v7.widget.AppCompatSpinner.onMeasure(AppCompatSpinner.java:416) 
    at android.view.View.measure(View.java:17548) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5478) 
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 
    at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1083) 
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:615) 
    at android.view.View.measure(View.java:17548) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5478) 
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 
    at android.view.View.measure(View.java:17548) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5478) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 
    at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139) 
    at android.view.View.measure(View.java:17548) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5478) 
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 
    at android.view.View.measure(View.java:17548) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5478) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 
    at android.view.View.measure(View.java:17548) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5478) 
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 
    at android.view.View.measure(View.java:17548) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5478) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2632) 
    at android.view.View.measure(View.java:17548) 
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2125) 
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1238) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1455) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1126) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6041) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:792) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:596) 
    at android.view.Choreographer.doFrame(Choreographer.java:557) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:778) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
+0

Ich denke, Sie versuchen, eine "Listview" mit mehreren Zeilen Ansichten zu erstellen, wenn ja dann diese Implementierung falsch ist, werfen Sie einen Blick auf diese [Frage] (http://stackoverflow.com/questions/4777272/android-listview -mit-verschiedenen-Layouts-für-jede-Zeile). Auch würde ich vorschlagen, dass Sie 'RecyclerView' anstelle von' listview' verwenden. –

+0

Da Sie zwei verschiedene Layouts verwenden, stellen Sie sicher, dass dieselbe Ansicht mit der gleichen ID 'R.id.spinner_item_two' in zwei Layouts vorhanden ist. Hoffe das wird helfen! – ArbenMaloku

+0

Bitte überprüfen Sie meine Antwort unter – blueware

Antwort

1

Zuerst wird die Ausgabe null ist, ist, dass (TextView) v.findViewById(R.id.spinner_item_two) Rückkehr null (== finde die Ansicht mit der ID R.id.spinner_item_two in v nicht). Sie müssen überprüfen, ob diese ID in Ihrem XML-Layout korrekt ist.

Zweitens, blähen Sie andere Ansicht durch die Position auf. Das Problem ist, dass das Framework es ohne Unterschied wiederverwenden wird. Sie müssen getItemViewType(int position) überschreiben, um zwei int zurückzugeben, einen für jede Art der Ansicht.

Schließlich geben uns das Framework eine schönere Methode mit RecyclerView zu tun. Wenn Sie Zeit haben, check it.

0

Sind Sie sicher, dass die Textview als id „spinner_item_two“ in beiden Dateien „spinner_header_item_two.xml“ existiert und mit „spinner_item_two.xml?

1

Sie sind ein ViewHolder für zwei verschiedene Adapter-Layouts, das, was produziert NULL festlegbare Ansichten, alternativ können Sie getItemViewType Methode in Ihrem Adapter außer Kraft setzen Kopf Position und normalen Artikel wie folgt zu bestimmen:

1- definieren diese Konstanten in Ihrer Adapter Klasse:

private final int TYPE_HEADER = 0; 
private final int TYPE_ITEM = 1; 

2- Aufschalten der getItemViewType(int position) Methode in Ihrem Adapter:

@Override 
public int getItemViewType(int position) { 
    if (isPositionHeader(position)) 
     return TYPE_HEADER; 

    return TYPE_ITEM; 
} 

private boolean isPositionHeader(int position) { 
    return position == 0; 
} 

3- erstellen ViewHolder Klasse für Header Artikele:

class SpinnerHeaderViewHolder { 
    TextView txtHeader; 
    public SpinnerHeaderViewHolder(View v) { 
     txtHeader= (TextView) v.findViewById(R.id.spinner_header_item_text_view); 
    } 
} 

nicht die Bezug zu nehmen Vergessen 'txtHeader' an die richtige ID in Ihrem (Header-Layout)

4- Jetzt in Ihrer getCustomView(int position, View convertView, @NonNull ViewGroup parent) Methode, dies zu tun:

public View getCustomView(int position, View convertView, ViewGroup parent) { 
    final ViewHolder viewHolder; 

    final int itemType = getItemViewType(position); 

    if (convertView == null) { 
     if (itemType == TYPE_HEADER) { 
      convertView = inflater.inflate(R.layout.spinner_header_item_two, parent, false); 
      viewHolder = new SpinnerHeaderViewHolder(convertView); 
     } else { 
      convertView = inflater.inflate(R.layout.spinner_item_two, parent, false); 
      viewHolder = new SpinnerViewHolder(convertView); 
     } 
     convertView.setTag(viewHolder); 

    } else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 

    if (position == 0) { 
     ((SpinnerHeaderViewHolder) viewHolder).txtHeader.setText(headerTxt); 
    } else { 
     ((SpinnerViewHolder) viewHolder).txtVue.setText(services.get(position).getName_en()); 
    } 

    return convertView; 
} 

Hope this helfen.

+0

Ich habe meine Adapter aktualisiert und getViewType Funktion verwendet, aber immer noch mit dem gleichen Problem, IDs sind korrekt und die Viewholders für Header und normale Elemente getrennt –

+0

Warum Sie 'getCustomView' Methode verwenden, während Sie direkt implementieren können Ihr Code innerhalb der 'getView' Methode? – blueware

+0

bin ein ArrayAdapter zu benutzerdefinierten Spinner Adapter kein BaseAdapter –

Verwandte Themen