【问题标题】:Custom adapter shows RuntimeException - ListView自定义适配器显示 RuntimeException - ListView
【发布时间】:2014-12-29 11:22:57
【问题描述】:

我有一个ListView 和一个自定义的Adapter,但是当我将该适配器设置为我的Listview 时,它会显示这样的错误。

Logcat:

12-29 16:43:43.740: E/AndroidRuntime(27363): 致命异常: main 12-29 16:43:43.740: E/AndroidRuntime(27363): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.rh.bookmany/com.rh.bookmany.MFragmentContainer}: java.lang.NullPointerException 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2121) 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2146) 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 android.app.ActivityThread.access$700(ActivityThread.java:140) 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238) 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 android.os.Handler.dispatchMessage(Handler.java:99) 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 android.os.Looper.loop(Looper.java:137) 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 android.app.ActivityThread.main(ActivityThread.java:4944) 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 java.lang.reflect.Method.invokeNative(Native Method) 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 java.lang.reflect.Method.invoke(Method.java:511) 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 12-29 16:43:43.740: E/AndroidRuntime(27363): at dalvik.system.NativeStart.main(Native Method) 12-29 16:43:43.740: E/AndroidRuntime(27363): 由: java.lang.NullPointerException 引起 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 com.rh.bookmany.navigationadapter.TheatreListAdapter.getCount(TheatreListAdapter.java:40) 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 android.widget.ListView.setAdapter(ListView.java:466) 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 com.rh.bookmany.ShowTimeFragment.onCreateView(ShowTimeFragment.java:43) 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:829) 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035) 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 android.app.BackStackRecord.run(BackStackRecord.java:635) 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1399) 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 android.app.Activity.performStart(Activity.java:5197) 12-29 16:43:43.740: E/AndroidRuntime(27363): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2094) 12-29 16:43:43.740: E/AndroidRuntime(27363): ... 11 更多

这是我的Fragment

public class ShowTimeFragment extends Fragment {

    List<Theatre> theatreList;
    ListView lvTheatre;
    TheatreListAdapter tlAdapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        // Inflating View
        View v = inflater.inflate(R.layout.theatre_showtime, container, false);

        lvTheatre = (ListView) v.findViewById(R.id.lvTheatre);

        tlAdapter = new TheatreListAdapter(getActivity().getBaseContext(),theatreList);

        lvTheatre.setAdapter(tlAdapter);

        return v;
    }
}

这是我的Adapter

public class TheatreListAdapter extends BaseAdapter {

    Context c;
    List<Theatre> theatreList;
    LayoutInflater lInflater;


    public TheatreListAdapter(Context c,List<Theatre> theatreList)
    {
        Log.d("X","Constructor called");
        try {
            this.c = c;
            this.theatreList = theatreList;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.e("X",e.getMessage());
        }
        Log.d("X","Constuctor Passed");
    }

    @Override
    public int getCount() {
        return theatreList.size();
    }

    @Override
    public Object getItem(int position) {
        return theatreList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        Log.d("X","getView Called");

        try {
            //Checking inflater already inflated
            if(lInflater==null)
            {
                lInflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            }

            //Checking convertView already instantiated
            if(convertView==null)
            {
                convertView = lInflater.inflate(R.layout.theatre_fragment_row, null);
            }

            //Inst. UI elements
            TextView tvTheatre = (TextView) convertView.findViewById(R.id.tvTheatre);
            TextView tvShowTimes = (TextView) convertView.findViewById(R.id.tvShowTimes);

            //Inst. Theatre for row
            Theatre mTheatre = theatreList.get(position);

            //Generating showTimes
            String showTimes = "";

            for(String showTime:mTheatre.getShowTimes())
            {
                showTimes+=showTime;
            }

            //Setting collected information to the UI elements
            tvTheatre.setText(mTheatre.getTheatre());
            tvShowTimes.setText(showTimes);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.e("X",e.getMessage());
        }

        return convertView;

    }

}

当我删除 setAdapter 方法时,它工作正常,这意味着没有错误显示。 但是,当我设置该适配器时,它会在我的 logcat 中显示错误。

【问题讨论】:

  • 初始化你的 theatreList 为 theatreList= new List();在您的 Fragment 类中并在其中放置一些对象

标签: java android listview


【解决方案1】:

您获得 NPE,因为您的 theatreList 为空。你不用在任何地方初始化它。

【讨论】:

  • 天啊。谢谢兄弟。我忘了这样做。非常感谢。
  • 你的回答很好。但请说明如何解决它?
【解决方案2】:

在你的日志中看到这一行

Caused by: java.lang.NullPointerException

你还没有初始化theatreList

tlAdapter = new TheatreListAdapter(getActivity().getBaseContext(),theatreList);

【讨论】:

  • 对不起兄弟,degrigorash 先回答。所以他应得的。但我会从我的朋友帐户中投票给你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
相关资源
最近更新 更多