我尝试在我的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>
答案 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方法