Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 自定义适配器在getView中引发空异常_Android_Android Arrayadapter_Listadapter - Fatal编程技术网

Android 自定义适配器在getView中引发空异常

Android 自定义适配器在getView中引发空异常,android,android-arrayadapter,listadapter,Android,Android Arrayadapter,Listadapter,我正在尝试使用自定义适配器设置ListAdapter。我有一个所有者、一个OnwerAdapter、一个OnwerDetail和一个OnwerAsyncTask。我打电话给OwnerAsyncTask获取所有者列表;但是,当我设置列表适配器时,它会抛出一个异常。在尝试设置textView时,Exection被抛出到OwnerAdapter类中。以下是一些示例代码: //OwnerAdapter package com.mb.carlovers.adapter; import com.mb.ca

我正在尝试使用自定义适配器设置ListAdapter。我有一个所有者、一个OnwerAdapter、一个OnwerDetail和一个OnwerAsyncTask。我打电话给OwnerAsyncTask获取所有者列表;但是,当我设置列表适配器时,它会抛出一个异常。在尝试设置textView时,Exection被抛出到OwnerAdapter类中。以下是一些示例代码:

//OwnerAdapter
package com.mb.carlovers.adapter;

import com.mb.carlovers.Owner;
import com.mb.carlovers.R;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class OwnerAdapter extends ArrayAdapter<Owner> {

    private Context context;
    private int layoutResourceId;
    private Owner data[] = null;

    public OwnerAdapter(Context context, int textViewResourceId,Owner[] data) {
        super(context, textViewResourceId, data);
        this.context = context;
        this.layoutResourceId = textViewResourceId;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        OwnerHolder holder = null;

        if(row == null)
        {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);
            holder = new OwnerHolder();
            holder.tvFName = (TextView) row.findViewById(R.id.tvFirstName);
            holder.tvLName = (TextView) row.findViewById(R.id.tvLastName);
            holder.tvCId = (TextView) row.findViewById(R.id.tvCarID);
            row.setTag(holder);
        } else
        {
            holder = (OwnerHolder) row.getTag();
        }


        Owner item = data[position];
        String fName = item.getFirstName();

         **//The exception is thrown here.**
       // holder.tvFName.setText(item.setFirstName.toString()); //This was throwing an error.
           holder.tvFName.setText("Tester") //This is still throwing an exception
        holder.tvLName.setText("Example");
        holder.tvCId.setText("1");
        return row;
    }

    static class OwnerHolder
    {
      TextView tvFName;
      TextView tvLName;
      TextView tvCId;
    }
}

// Here is the owner's class

package com.mb.carlovers;

public class Owner {

    private String _firstName;
    private String _lastName;
    private String _carId;
    private Car _car;

    public Owner()
    {
      this._firstName = "";
      this._lastName = "";
      this._carId = "";
    }

    public Owner(String lName)
    {
      this._lastName = lName;
    }
    public Owner(String lName, String cId)
    {
      this._lastName = lName;
      this._carId = cId;
    }

    public Owner(String lName, String fName, String cId)
    {
      this._lastName = lName;
      this._firstName  = fName;
      this._carId = cId;
    }

    public Owner(String lName, String fName, String cId, Car car)
    {
         this._lastName = lName;
         this._firstName  = fName;
         this._carId = cId;
         this._car = car;
    }
    //Getters
    public String getFirstName()
    {
        return _firstName;
    }
    public String getLastName()
    {
        return _lastName;
    }
    public String getCarId()
    {
        return _carId;
    }

    public Car getCar()
    {
        return _car;
    }
    //Setters
    public void setFirstName(String fName)
    {
         _firstName = fName;
    }
    public void setLastName(String lName)
    {
        _lastName = lName;
    }
    public void setCarId(String cId)
    {
        _carId = cId;
    }

    public void setCar(Car car)
    {
        _car = car;
    }
}

//Here is the owner AsyncTask

package com.mb.carlovers.asynctask;

import java.util.ArrayList;
import java.util.List;

import com.mb.carlovers.Owner;
import android.os.AsyncTask;

public class OnwerAsyncTask extends AsyncTask<String, Void, List<Owner>> {

    private List<Owner> items = null;
    @Override
    protected List<Owner> doInBackground(String... params) {

        try
        {
            items = new ArrayList<Owner>();
            Owner own = new Owner();
            own.setFirstName("John");
            own.setLastName("Smith");
            own.setCarId("1");
            items.add(own);

            Owner own1 = new Owner();
            own1.setFirstName("Samantha");
            own1.setLastName("Right");
            own1.setCarId("2");
            items.add(own1);

            Owner own2 = new Owner();
            own2.setFirstName("Regie");
            own2.setLastName("Miller");
            own2.setCarId("3");
            items.add(own2);

            Owner own3 = new Owner();
            own3.setFirstName("Mark");
            own3.setLastName("Adam");
            own3.setCarId("4");
            items.add(own3);

        } catch(Exception ex)
        {
            ex.toString();
        }
        return items;
    }

    @Override
    protected void onPostExecute(List<Owner> result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
    }

}


//Here is the OnwerDetailList whenre the AsyncTask is being called
package com.mb.carlovers;

import java.util.List;
import java.util.concurrent.ExecutionException;

import com.mb.carlovers.adapter.OwnerAdapter;
import com.mb.carlovers.asynctask.OnwerAsyncTask;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;

public class OwnerDetail extends ListFragment {

    OwnerAdapter ownerAdapter = null;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.customize_layout,container, false);
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         OnwerAsyncTask asynTask = new OnwerAsyncTask();
            List<Owner> lt = null;
            try {
                lt = asynTask.execute("").get();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Owner myOwners[] = lt.toArray(new Owner[lt.size()]);
            super.onActivityCreated(savedInstanceState);
            ownerAdapter = new OwnerAdapter(getActivity(),android.R.layout.simple_list_item_activated_1 , myOwners);
    }


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setListAdapter(ownerAdapter);
    }
}

问题是您使用的是只包含一个字段的字段:android.R.id.text1

由于该布局中不存在R.id.tvFirstName,findViewById()返回null,并且ViewHolder的属性为null,这就是它引发null指针异常的原因

为了使其工作,您必须使用这些字段创建一个自定义视图,并将其id传递给适配器

使用简单的列表项激活项1,最好只显示一个字段。通过简单列表项激活,可以显示两个字段。对于任何自定义内容,都必须创建自己的视图

为了使其与简单列表项激活项一起工作,您应该注释掉以下几行:

holder.tvLName.setText("Example");
holder.tvCId.setText("1");
并更改此行:

holder.tvFName = (TextView) row.findViewById(R.id.tvFirstName);
致:


您发布的代码的哪一行(OwnerAdapter.java)是第48行。您的问题源于这一行。@Gagouche,将来,将日志异常放在代码块中。这样看起来更好。
holder.tvFName = (TextView) row.findViewById(R.id.tvFirstName);
holder.tvFName = (TextView) row.findViewById(android.R.id.text1);