在片段android创build列表视图

作为标题,我想在Fragment中用自定义行创build一个listview。 我的代码如下。

片段类

public class PhotosFragment extends Fragment{ public PhotosFragment(){} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_photos, container, false); ArrayList<ListviewContactItem> listContact = GetlistContact(); ListView lv = (ListView)getActivity().findViewById(R.id.lv_contact); lv.setAdapter(new ListviewContactAdapter(getActivity(), listContact)); return rootView; } private ArrayList<ListviewContactItem> GetlistContact(){ ArrayList<ListviewContactItem> contactlist = new ArrayList<ListviewContactItem>(); ListviewContactItem contact = new ListviewContactItem(); contact.SetName("Topher"); contact.SetPhone("01213113568"); contactlist.add(contact); contact = new ListviewContactItem(); contact.SetName("Jean"); contact.SetPhone("01213869102"); contactlist.add(contact); contact = new ListviewContactItem(); contact.SetName("Andrew"); contact.SetPhone("01213123985"); contactlist.add(contact); return contactlist; } } 

适配器类

 public class ListviewContactAdapter extends BaseAdapter{ private static ArrayList<ListviewContactItem> listContact; private LayoutInflater mInflater; public ListviewContactAdapter(Context photosFragment, ArrayList<ListviewContactItem> results){ listContact = results; mInflater = LayoutInflater.from(photosFragment); } @Override public int getCount() { // TODO Auto-generated method stub return listContact.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return listContact.get(arg0); } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return arg0; } public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder holder; if(convertView == null){ convertView = mInflater.inflate(R.layout.contact_item, null); holder = new ViewHolder(); holder.txtname = (TextView) convertView.findViewById(R.id.lv_contact_item_name); holder.txtphone = (TextView) convertView.findViewById(R.id.lv_contact_item_phone); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.txtname.setText(listContact.get(position).GetName()); holder.txtphone.setText(listContact.get(position).GetPhone()); return convertView; } static class ViewHolder{ TextView txtname, txtphone; } } 

但是当我运行没有显示任何东西的应用程序。 有谁能告诉我这里有什么问题,我该如何解决?

Solutions Collecting From Web of "在片段android创build列表视图"

我猜你的应用程序因为NullPointerException崩溃。

改变这一点

 ListView lv = (ListView)getActivity().findViewById(R.id.lv_contact); 

 ListView lv = (ListView)rootView.findViewById(R.id.lv_contact); 

假设listview属于片段布局。

其余的代码看起来没问题

编辑:

那么既然你说这是行不通的,我自己试了一下

在这里输入图像说明

请使用ListFragment 。 否则,它将无法正常工作。

编辑1:那么你只需要setListAdapter()getListView()

inflate()方法有三个参数:

  1. 布局XML文件(在R.layout内)的id,
  2. 要插入片段View的父ViewGroup,

  3. 第三个布尔值,告诉片段的视图是否从布局XML文件膨胀,应该插入到父ViewGroup中。

在这种情况下,我们传递false是因为View会被其他地方的父ViewGroup附加到我们调用的一些Android代码(换句话说,在我们的背后)。 当您将最后一个parameter passing给inflate()时,父ViewGroup仍然用于充气View的布局计算,因此您不能将null作为父ViewGroup传递。

  View rootView = inflater.inflate(R.layout.fragment_photos, container, false); 

所以,你需要在这里调用rootView

 ListView lv = (ListView)rootView.findViewById(R.id.lv_contact); 

你需要给:

 public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } 

里面的片段。

代替:

 public class PhotosFragment extends Fragment 

您可以使用:

 public class PhotosFragment extends ListFragment 

它改变了方法

  @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ArrayList<ListviewContactItem> listContact = GetlistContact(); setAdapter(new ListviewContactAdapter(getActivity(), listContact)); } 

onActivityCreated是无效的,你不需要像onCreateView那样返回一个视图

你可以在这里看到一个例子