在片段android中创建listview

Posted

技术标签:

【中文标题】在片段android中创建listview【英文标题】:Create listview in fragment android 【发布时间】:2014-04-26 02:37:36 【问题描述】:

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


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

【问题讨论】:

不,它运行良好,但在片段中不显示任何内容。 我也在尝试同样的事情。可以给我完整的源代码吗? 我在我的问题中发布的所有内容。你也可以在google上找到很多关于listview的教程。 对我来说也一样,在这里我的代码***.com/questions/26254727/… 嗨@gamo 你能告诉我布局“contact_item”和Java“ListviewContactItem”的代码吗?我正在尝试做类似的事情。 【参考方案1】:

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

改变这个

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

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

假设listview属于片段布局。

其余的代码看起来还不错

编辑:

好吧,既然你说它不起作用,我自己试过了

【讨论】:

@user3422401 好的,我会尝试您的代码并在 5 分钟内返回。但是代码看起来还不错 @user3422401 它工作正常我只按照我的帖子中的建议进行了更改。 @user3422401 检查快照是否正常工作。所以我们需要更多信息。发布的代码很好。您在哪里将片段添加到活动中。发布 xml 布局 我试过了,但对我不起作用。我在 MainActivity 的滑动菜单调用中的 Fragment 类,但我认为这并不重要。 @user3422401 AFAIK 您发布的代码没有任何问题。其他地方有问题【参考方案2】:

请使用ListFragment。否则,它将不起作用。

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

【讨论】:

让我试试。我会把结果留给你。 你能给我们举一个 ListFragment 是如何工作的例子吗? 看看这个:tutorialspoint.com/android/android_list_fragment.htm【参考方案3】:

你需要付出:

public void onActivityCreated(Bundle savedInstanceState)    

  super.onActivityCreated(savedInstanceState);

内部片段。

【讨论】:

【参考方案4】:

inflate() 方法接受三个参数:

    布局 XML 文件的 ID(在 R.layout 内),

    要插入片段视图的父视图组,

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

在这种情况下,我们传递 false 因为视图将附加到 其他地方的父 ViewGroup,通过我们调用的一些 Android 代码(在 换句话说,在我们背后)。当您将 false 作为最后一个参数传递时 到 inflate(),父 ViewGroup 仍然用于布局 膨胀视图的计算,因此您不能将 null 作为父级传递 视图组。

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

所以,你需要在这里打电话给rootView

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

【讨论】:

【参考方案5】:

改为:

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

【讨论】:

以上是关于在片段android中创建listview的主要内容,如果未能解决你的问题,请参考以下文章

如何膨胀由 Android Studio 向导在 Activity 中创建的片段(列表)?

如何在片段中创建选项卡的示例?

如何隐藏默认片段 actionBar 在 android & kotlin 中创建我们自己的 actionBar

在 Android 中创建带有导航抽屉的汉堡菜单

如何在 Android TV 中创建 Youtube 主题子标题?

在片段中创建日期选择器