2017-02-28 38 views
1

我使用viewholder百通連接的類實例化和重用我的項目每次我嘗試的工作woth適配器的Android ArrayAdapter viewHolder模式giiving空的觀點

反正只要想設置視圖文本某些價值觀的思考它崩潰給該視圖是空

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

我想你試圖用多行視圖創建一個'listview',如果是的話那麼這個實現是錯誤的,看看這個[question](http://stackoverflow.com/questions/4777272/android-listview -with-不同的佈局換每列)。另外我建議你使用'RecyclerView'而不是'listview'。 –

+0

由於您使用了兩種不同的佈局,因此請確保在兩種佈局中使用相同的標識'R.id.spinner_item_two'具有相同的視圖。希望這會有所幫助! – ArbenMaloku

+0

請檢查我的答案 – blueware

回答

1

首先,問題是(TextView) v.findViewById(R.id.spinner_item_two)回報null(==在v中找不到編號爲R.id.spinner_item_two的視圖)。你必須檢查這個ID在你的XML佈局中是否正確。

其次,你膨脹不同的觀點的位置。問題在於框架將不加區分地重複使用它。您必須覆蓋getItemViewType(int position)以返回兩個int,每個類型的視圖

最後,框架給了我們一個更漂亮的方法來處理RecyclerView。如果你有時間,check it

0

你肯定有作爲ID「spinner_item_two」 TextView的存在於兩個文件「spinner_header_item_two.xml」和「spinner_item_two.xml?

1

您正在使用兩種不同的接口布局一個ViewHolder,這會產生什麼可空意見,或者,您可以在您的Adapter覆蓋getItemViewType方法來確定標題項普通項目這樣的:

1-定義這些常量在適配器類:

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

2 - 覆蓋的getItemViewType(int position)方法在適配器:

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

    return TYPE_ITEM; 
} 

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

3-創建ViewHolder的標題項目

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

不要忘記提及的'txtHeader'到您的(標題佈局)中的正確標識

4-現在,在您getCustomView(int position, View convertView, @NonNull ViewGroup parent)方法,這樣做:

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

希望這會有所幫助。

+0

我確實更新了我的適配器並使用了getViewType函數,但仍面臨同樣的問題,id正確,併爲標題和常規項目分隔了視圖 –

+0

爲什麼在使用'getCustomView'方法時可以直接執行你的代碼在'getView'方法中? – blueware

+0

上午使用ArrayAdapter自定義spinners適配器不是baseAdapter –