使用自定义数组适配器的NullPointerException

时间:2015-04-19 08:49:38

标签: android android-arrayadapter

我正在努力解决这个错误:我创建了一个自定义数组适配器,当我尝试访问使用findviewbyid初始化的textview时,我在getView方法上有一个空指针异常:

  private class MarkerArrayAdapter extends ArrayAdapter<MarkerWrapper> {
    private ArrayList<MarkerWrapper> markerList;

    public MarkerArrayAdapter(Context context, int textViewResourceId,
            ArrayList<MarkerWrapper> markersList) {
        super(context, textViewResourceId, markersList);
        this.markerList = markersList;
    }

    private class ViewHolder {
        TextView ID_marker;
        TextView chr;
        TextView position;
        TextView risk_allele;
        TextView ref_allele;
        TextView genome_patient;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        // Log.v("ConvertView", String.valueOf(position));

        if (convertView == null) {
            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.raw_data_item, null);

            holder = new ViewHolder();
            holder.ID_marker = (TextView) findViewById(R.id.raw_data_report_textview_1);
            holder.chr = (TextView) findViewById(R.id.raw_data_report_textview_2);
            holder.position = (TextView) findViewById(R.id.raw_data_report_textview_3);
            holder.risk_allele = (TextView) findViewById(R.id.raw_data_report_textview_4);
            holder.ref_allele = (TextView) findViewById(R.id.raw_data_report_textview_5);
            holder.genome_patient = (TextView) findViewById(R.id.raw_data_report_textview_6);
            convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        MarkerWrapper marker = markerList.get(position);

        //NullPointer on this line
        holder.ID_marker.setText(marker.getID_marker());
        holder.chr.setText(marker.getChr());
        holder.position.setText(marker.getPosition());
        holder.risk_allele.setText(marker.getRisk_allele());
        holder.ref_allele.setText(marker.getRef_allele());
        holder.genome_patient.setText(marker.getGenome_patient());

        return convertView;

    }

} 

我的raw_data_item.xml如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="6dip" >

<TextView
    android:id="@+id/raw_data_report_textview_1"
    android:layout_width="22dp"
    android:layout_height="fill_parent"
    android:layout_weight="0.90"
    android:textAppearance="?android:attr/textAppearanceSmall" />

<TextView
    android:id="@+id/raw_data_report_textview_2"
    android:layout_width="14dp"
    android:layout_height="fill_parent"
    android:textAppearance="?android:attr/textAppearanceSmall" />

<TextView
    android:id="@+id/raw_data_report_textview_3"
    android:layout_width="38dp"
    android:layout_height="fill_parent"
    android:layout_weight="0.35"
    android:textAppearance="?android:attr/textAppearanceSmall" />

<TextView
    android:id="@+id/raw_data_report_textview_4"
    android:layout_width="36dp"
    android:layout_height="fill_parent"
    android:textAppearance="?android:attr/textAppearanceSmall" />

<TextView
    android:id="@+id/raw_data_report_textview_5"
    android:layout_width="44dp"
    android:layout_height="fill_parent"
    android:textAppearance="?android:attr/textAppearanceSmall" />

<TextView
    android:id="@+id/raw_data_report_textview_6"
    android:layout_width="85dp"
    android:layout_height="fill_parent"
    android:textAppearance="?android:attr/textAppearanceSmall" />

我看到很多人都有同样的问题,但他们的答案都没有对我有用,所以我非常感谢你的帮助。

04-19 11:05:03.657: E/AndroidRuntime(2229): FATAL EXCEPTION: main
04-19 11:05:03.657: E/AndroidRuntime(2229): Process:  PID: 2229
04-19 11:05:03.657: E/AndroidRuntime(2229): java.lang.NullPointerException:                     Attempt to invoke virtual method 'void     android.widget.TextView.setText(java.lang.CharSequence)' on a null object     reference
04-19 11:05:03.657: E/AndroidRuntime(2229):     at RawDataReportActivity$MarkerArrayAdapter.getView(RawDataReportActivity.java:162)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.widget.AbsListView.obtainView(AbsListView.java:2842)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.widget.ListView.makeAndAddView(ListView.java:1884)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.widget.ListView.fillDown(ListView.java:713)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.widget.ListView.fillFromTop(ListView.java:779)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.widget.ListView.layoutChildren(ListView.java:1693)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.widget.AbsListView.onLayout(AbsListView.java:2632)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.View.layout(View.java:16550)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.ViewGroup.layout(ViewGroup.java:5303)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:2102)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1956)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.widget.LinearLayout.onLayout(LinearLayout.java:1865)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.View.layout(View.java:16550)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.ViewGroup.layout(ViewGroup.java:5303)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.View.layout(View.java:16550)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.ViewGroup.layout(ViewGroup.java:5303)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:801)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.View.layout(View.java:16550)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.ViewGroup.layout(ViewGroup.java:5303)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.View.layout(View.java:16550)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.ViewGroup.layout(ViewGroup.java:5303)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:494)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.View.layout(View.java:16550)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.ViewGroup.layout(ViewGroup.java:5303)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.View.layout(View.java:16550)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.ViewGroup.layout(ViewGroup.java:5303)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2308)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2021)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1180)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6558)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:777)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.Choreographer.doCallbacks(Choreographer.java:590)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.Choreographer.doFrame(Choreographer.java:560)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:763)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.os.Handler.handleCallback(Handler.java:739)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.os.Handler.dispatchMessage(Handler.java:95)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.os.Looper.loop(Looper.java:145)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at android.app.ActivityThread.main(ActivityThread.java:5832)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at java.lang.reflect.Method.invoke(Native Method)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at java.lang.reflect.Method.invoke(Method.java:372)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
04-19 11:05:03.657: E/AndroidRuntime(2229):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

2 个答案:

答案 0 :(得分:1)

我认为你不是在convertView上调用findViewById。我认为你的if循环应该如下所示

if (convertView == null) {
        LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = vi.inflate(R.layout.raw_data_item, null);

        holder = new ViewHolder();
        holder.ID_marker = (TextView) convertView.findViewById(R.id.raw_data_report_textview_1);
        holder.chr = (TextView) convertView.findViewById(R.id.raw_data_report_textview_2);
        holder.position = (TextView) convertView.findViewById(R.id.raw_data_report_textview_3);
        holder.risk_allele = (TextView) convertView.findViewById(R.id.raw_data_report_textview_4);
        holder.ref_allele = (TextView) convertView.findViewById(R.id.raw_data_report_textview_5);
        holder.genome_patient = (TextView) convertView.findViewById(R.id.raw_data_report_textview_6);
        convertView.setTag(holder);

    }

我认为你已经在活动中编写了这个类,所以你试图在活动布局中找到这些视图。

答案 1 :(得分:0)

您必须添加convertview.findViewById(.... )

 holder.ID_marker = (TextView) convertView.findViewById(R.id.raw_data_report_textview_1);
            holder.chr = (TextView) convertView.findViewById(R.id.raw_data_report_textview_2);
            holder.position = (TextView) convertView.findViewById(R.id.raw_data_report_textview_3);
            holder.risk_allele = (TextView) convertView.findViewById(R.id.raw_data_report_textview_4);
            holder.ref_allele = (TextView) convertView.findViewById(R.id.raw_data_report_textview_5);
            holder.genome_patient = (TextView) convertView.findViewById(R.id.raw_data_report_textview_6);

祝你好运