作为标题我想在Fragment中创建一个带有自定义行的列表视图。我的代码如下。
片段类
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;
}
}
但是当我运行那个没有显示任何东西的应用程序时。谁能告诉我这里有什么问题,我该如何解决?
答案 0 :(得分:40)
我猜您的应用因NullPointerException
而崩溃。
更改此
ListView lv = (ListView)getActivity().findViewById(R.id.lv_contact);
到
ListView lv = (ListView)rootView.findViewById(R.id.lv_contact);
假设listview属于片段布局。
其余代码看起来没问题
编辑:
好吧,因为你说它不起作用我自己尝试了
答案 1 :(得分:4)
请使用ListFragment
。否则,它将无法工作。
编辑1:
然后,您只需要setListAdapter()
和getListView()
。
答案 2 :(得分:2)
你需要给:
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
}
内部片段。
答案 3 :(得分:2)
要插入片段视图的父ViewGroup,
第三个布尔值,告诉片段的视图是否为膨胀 应将布局XML文件插入到父ViewGroup中。
在这种情况下,我们传递false,因为View将被附加到 父ViewGroup在其他地方,我们调用的一些Android代码(在 换句话说,在我们背后)。当您将false作为最后一个参数传递时 为了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);
答案 4 :(得分:0)
相反:
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中的视图
您可以看到示例here