android listview null尝试setAdapter()

时间:2015-12-11 06:43:48

标签: java android listview

我尝试在我的ListView中实施Fragment,无论我尝试什么,我都会获得NullPointerException。我检查对象是否为null并记录它们是否存在,并且ListView显示为空,但ListItemAdapter似乎已被证实。

   ListItemAdapter listAdapter = new ListItemAdapter(getContext(), R.layout.list_item_fragment, walks);
    if(listAdapter == null)
        Log.d("ListAdapter: ", "Null!!!");
    else
        Log.d("ListAdapter: ", "Not Null!!!");

    ListView listView = (ListView) getActivity().findViewById(R.id.list_view);

    if(listView == null)
        Log.d("ListView: ", "Null!!!");
    else
        Log.d("ListView: ", "Not Null!!!");
    listView.setAdapter(listAdapter);

编辑:继承整个片段

package com.janedoe.anothertabexample.fragments;

import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import com.janedoe.anothertabexample.R;
import com.janedoe.anothertabexample.models.WalkModel;

import java.util.ArrayList;
import com.janedoe.anothertabexample.Adapters.*;

public class TabFragment1 extends Fragment {


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

        ArrayList<WalkModel> walks = new ArrayList<>();
        WalkModel walk1 = new WalkModel();
        walk1.setDescription("Walked around the block.");
        walk1.setElapsed_time(SystemClock.uptimeMillis() - 99999999);

        WalkModel walk2 = new WalkModel();
        walk2.setDescription("Walked to store.");
        walk2.setElapsed_time(SystemClock.uptimeMillis() - 98999000);

        WalkModel walk3 = new WalkModel();
        walk3.setDescription("Ran a million miles.");
        walk3.setElapsed_time(SystemClock.uptimeMillis() - 97999999);

        WalkModel walk4 = new WalkModel();
        walk4.setDescription("Biked");
        walk4.setElapsed_time(SystemClock.uptimeMillis() - 96999999);

        walks.add(walk1);
        walks.add(walk2);
        walks.add(walk3);
        walks.add(walk4);

        ListItemAdapter listAdapter = new ListItemAdapter(getContext(), R.layout.list_item_fragment, walks);
        if(listAdapter == null)
            Log.d("ListAdapter: ", "Null!!!");
        else
            Log.d("ListAdapter: ", "Not Null!!!");
        ListView listView = (ListView) getView().findViewById(R.id.list_view);
        if(listView == null)
            Log.d("ListView: ", "Null!!!");
        else
            Log.d("ListView: ", "Not Null!!!");
        listView.setAdapter(listAdapter);

        return inflater.inflate(R.layout.tab_fragment_1, container, false);
    }
}

以下是自定义适配器:

package com.janedoe.anothertabexample.Adapters;

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

import com.janedoe.anothertabexample.R;
import com.janedoe.anothertabexample.fragments.TabFragment1;
import com.janedoe.anothertabexample.models.WalkModel;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

/**
 * Created by janedoe on 12/10/2015.
 */
public class ListItemAdapter extends ArrayAdapter<WalkModel> {

    public ListItemAdapter(Context context, int resource, ArrayList<WalkModel> walks) {
        super(context,resource, walks);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = LayoutInflater.from(getContext());
        View listItem = inflater.inflate(R.layout.list_item_fragment, parent, false);

        WalkModel model = getItem(position);

        TextView date = (TextView) listItem.findViewById(R.id.date);
        TextView time = (TextView) listItem.findViewById(R.id.time);
        TextView description = (TextView) listItem.findViewById(R.id.description);

        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
        String formattedDate = sdf.format(new Date(model.getDate()));

        date.setText(formattedDate);
        time.setText(String.valueOf(model.getElapsedTime()));
        description.setText(model.getDescription());

        return listItem;

    }
}

以下是list_item_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    android:id="@+id/list_item_fragment"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/datetime"
        android:orientation="vertical"
        android:layout_width="125dp"
        android:layout_height="60dp"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="5dp" >

        <TextView
            android:layout_width="match_parent"
            android:layout_height="25dp"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:text="01/01/1001"
            android:textAlignment="center"
            android:id="@+id/date"
            android:layout_marginBottom="2dp"
            android:textStyle="bold|italic" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="25dp"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:text="00:00:00"
            android:textAlignment="center"
            android:id="@+id/elapsed_time" />

    </LinearLayout>

    <TextView
        android:layout_toRightOf="@id/datetime"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:padding="5dp"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="This is a short description..."
        android:textAlignment="center"
        android:id="@+id/description" />

</RelativeLayout>

这是片段xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#d3d3d3">

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textAlignment="center"></ListView>

</RelativeLayout>

4 个答案:

答案 0 :(得分:1)

ListView位于您onCreateView()末尾正在充气的视图层次结构中。

getView()返回onCreateView()返回的内容,但尚未返回任何内容。此外,层次结构尚未附加到任何活动,因此使用getActivity().findViewById()的原始代码具有相同的问题。

所以,相反,先将视图层次结构膨胀并将其存储在变量中:

View root = inflater.inflate(R.layout.tab_fragment_1, container, false);

然后使用它来访问其子视图:

ListView listView = (ListView) root.findViewById(R.id.list_view);

最后返回整个层次结构:

return root;

答案 1 :(得分:0)

我甚至无法看到你的片段在哪里。片段上的方法必须>之前调用。

Null TextView object in a fragment

活动中没有ListView,因为它位于片段中。通过做:

ListView listView = (ListView) getActivity().findViewById(R.id.list_view);

你发现了一些不存在的东西。相反,由于它位于片段中,请执行以下操作:

ListView listView = (ListView) findViewById(R.id.list_view);

现在,listView实际上会存在。

答案 2 :(得分:0)

使用:

ListView listView= (ListView) rootView.findViewById(R.id.list_view);

这将解决您的问题。

答案 3 :(得分:0)

你应该在Fragment.onViewCreated回调方法中得到ListView的引用,这个方法的第一个参数是这个Fragment的根视图,所以只需要调用第一个参数对象的view.findViewById方法