在片段android中创建listview

时间:2014-03-19 16:52:49

标签: android listview android-fragments

作为标题我想在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;
}
}

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

5 个答案:

答案 0 :(得分:40)

我猜您的应用因NullPointerException而崩溃。

更改此

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

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

假设listview属于片段布局。

其余代码看起来没问题

编辑:

好吧,因为你说它不起作用我自己尝试了

enter image description here

答案 1 :(得分:4)

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

编辑1: 然后,您只需要setListAdapter()getListView()

答案 2 :(得分:2)

你需要给:

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

内部片段。

答案 3 :(得分:2)

inflate()方法有三个参数:

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

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

  4.   

    在这种情况下,我们传递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