当前位置: 首页 > 知识库问答 >
问题:

使用适配器在Listview中填充Listview

禄俊逸
2023-03-14

我有一块碎片。加载的视图的onCreateView方法上的这个片段有一个ListView(a)(在适配器(a)中填充)。但是,此ListView(A)中有另一个ListView(B)。所以现在,我必须调用适配器(B)来填充这个listview(B)。如果我从片段调用它,我会得到一个空指针,如果我从适配器调用它(a),它不会崩溃,但不会工作。

如何调用另一个适配器中的适配器。

这是片段的代码:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mContentView = inflater.inflate(R.layout.fragment_kidscontacts, container, false);
    mAdapter = new KidsContactsAdapter(getActivity());
    final ListView list = (ListView) mContentView.findViewById(R.id.listViewKidsContacts);
    list.setAdapter(mAdapter); 
    return mContentView;
}

其中mAdapter是对适配器(a)的调用。mContentView是一个简单的视图。现在,适配器的代码(A)中创建了一个名为Holder的Holder对象(它保存xml中的元素)。

public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder holder; //this is the holder object I created

    if (convertView == null) { //View received from parameter.
        convertView = LayoutInflater.from(mContext).inflate(R.layout.kids_contacts_list_item, parent, false);
        holder = new ViewHolder(); 
        holder.listViewKidsContacts = (ListView) convertView.findViewById(R.id.insidelistViewKidsContacts); //ListView(B)
        holder.kidImage = (ImageView) convertView.findViewById(R.id.kid_image);
        holder.statusImageView = (ImageView) convertView.findViewById(R.id.status_image_view);
        holder.nameTxtView = (TextView) convertView.findViewById(R.id.kid_friend_txtview);
        holder.statusTextView = (TextView) convertView.findViewById(R.id.kid_status_txtview);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    //Some work I do with the holder items assigning them 

    //Trying to fill the ListView(B)
        KidsInsideContactsAdapter mAdapter = new KidsInsideContactsAdapter(((Activity)mContext)); //This is the adapter(B)
        holder.listViewKidsContacts.setAdapter(mAdapter); //Assign the adapter(B) to the ListView(B)

    return convertView;
}

适配器(B)中有一些日志,但它们没有显示在LogCat中。列表视图也没有填充。它显示为没有listview。然而,在xml中,它是存在的。

共有2个答案

甄佐
2023-03-14

你是对的。要填充第二个列表视图,请在

@覆盖公共视图getView(最终int位置、视图转换视图、ViewGroup父级){

方法(在第一个列表视图中获取每个项目),必须从视图中获取(第二个)列表视图(convertView或为第一个列表视图的项目扩展布局)。在获取要填充的(第二个)列表视图后,在该方法中,您可以为其设置适配器,例如:ListView ListView=(ListView)view。findViewById(R.id.\uuuuuuu)//获取第一个列表视图listView中的第二个列表视图。setAdapter(第二个列表视图的适配器)

这应该行得通。把你的代码放在这里,我可以看一下,然后告诉你为什么它可能不起作用。

也可以看看这些:(如果你想做这样的事情)

https://github.com/emilsjolander/StickyListHeaders

或者如何在Android中创建粘性分区标题(如iOS)?

柴彬
2023-03-14

可能发生的一件事是第二个列表视图的高度没有正确设置,因为它在另一个列表视图中。我可能不得不处理一次。

尝试在第一个适配器中使用此方法来设置列表视图的高度(在设置适配器后),例如setListViewHeightBasedOnChildren(holder.listViewKidsContacts);

//动态设置ListView高度的方法

public static void setListViewHeightBasedOnChildren(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null)
        return;

    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.UNSPECIFIED);
    int totalHeight = 0;
    View view = null;
    for (int i = 0; i < listAdapter.getCount(); i++) {
        view = listAdapter.getView(i, view, listView);
        if (i == 0)
            view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, LayoutParams.WRAP_CONTENT));
        view.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
        totalHeight += view.getMeasuredHeight();
    }
    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
    listView.requestLayout();
}

如果这不起作用,我会尝试在以下行上进行断点:KidsInsideContactsAdapter mAdapter=newkidsinsidecontactsadapter(((Activity)mContext))//这是适配器(B)支架。ListViewKids联系人。setAdapter(mAdapter)//将适配器(B)分配给ListView(B)

调试时,检查mAdapter是否为null。还要在KidsInsideContactsAdapter的构造函数中设置断点,以查看是否一切正常。

还要检查以确保保持架。listViewKidsContacts是调试时要查找的列表视图。

 类似资料:
  • 问题内容: 我的Android应用程序需要使用中填充ListView数据ArrayList。 我这样做很麻烦。有人可以帮我提供代码吗? 问题答案: 你需要通过进行操作,以使ArrayList(或任何其他集合)适应布局中的项目(ListView,Spinner等)。 这是Android开发人员指南所说的: 一个管理任意对象数组支持的。默认情况下,此类期望提供的资源ID引用单个。如果要使用更复杂的布局

  • 我无法填充Firebase回收适配器。我最终想做的是,用户搜索一个名称,数据库中的结果将填充回收人员视图。 数据库结构如下所示: 要填充的代码如下所示,全部位于: 现在我只想让它填充数据库中的所有用户,但似乎什么都没有填充。 是一个。 这是UsersViewHolder类:公共静态类UsersViewHolder扩展了RecyclerView。视图持有者{View mView;TextView m

  • 问题内容: 我是Android的新手,我想尝试做一些非常基础的事情:Array中有5个字符串(例如’One’,’Two’…)。我想将这5个字符串添加到listactivity的列表视图中。 我的清单: 我的清单行: 基本上,我想将Array项绑定到TextView homeItemName。稍后我可能会在行中添加其他项,因此不能将listview绑定到条目。 谢谢! 问题答案: 对于代码,请快速浏

  • 问题内容: 我有一个JSON请求,该请求从youtube返回一个响应,其中包含对特定视频的评论。我目前有3种文本视图:一种用于名称/上载器,一种用于内容,一种用于发布日期- 然后用我的JSON响应中的数据填充。 我的问题是-仅出现第一个评论,发布日期和上传者。 我相信我将需要用列表视图替换我的textviews并将其解析为3个字段-我只是不知道如何。 爪哇 公共类Player扩展了YouTubeB

  • 问题内容: 我看了以下网站: ListView示例 其中描述了如何在使用默认适配器的列表视图中实现搜索功能,并且效果很好。 如何修改它,以便可以将其用于列表视图的自定义适配器? 部分代码为: 问题答案: 您需要覆盖适配器内部的getFilter并返回您创建的新的customFilter对象。看到这个答案: 编辑:

  • 问题内容: 我对Java,JavaFX和编程一般还是有点陌生​​,但是我遇到的问题困扰着我。 在大多数教程中,我查找了有关填充ListView(更具体地说,使用ObservableArrayList)的方法,最简单的方法是从String的ObservableList中创建它,如下所示: 但是我不想使用字符串。我想使用我制作的名为Words的自定义对象: 每个Word对象只有两个属性:wordStr