首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

带有自定义项目的Android ListView,其中一个字段是另一个自定义项目列表(非列表视图需要不可滚动)

带有自定义项目的Android ListView,其中一个字段是另一个自定义项目列表(非列表视图需要不可滚动)。

在Android开发中,如果我们需要在ListView中显示自定义项目,并且其中一个字段需要显示另一个自定义项目列表,我们可以通过自定义适配器来实现。

首先,我们需要创建两个自定义项目的布局文件。一个用于显示ListView的每个项目,另一个用于显示列表中的另一个自定义项目。

  1. 创建ListView项目的布局文件(例如list_item.xml):
代码语言:xml
复制
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <!-- 其他字段 -->
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="字段1" />

    <!-- 显示另一个自定义项目列表的容器 -->
    <LinearLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
    </LinearLayout>

</LinearLayout>
  1. 创建另一个自定义项目列表的布局文件(例如sub_item.xml):
代码语言:xml
复制
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <!-- 其他字段 -->
    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="字段2" />

    <!-- 其他字段 -->
    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="字段3" />

</LinearLayout>
  1. 创建自定义适配器(CustomAdapter.java):
代码语言:java
复制
public class CustomAdapter extends BaseAdapter {

    private List<Item> itemList;
    private LayoutInflater inflater;

    public CustomAdapter(Context context, List<Item> itemList) {
        this.itemList = itemList;
        inflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return itemList.size();
    }

    @Override
    public Object getItem(int position) {
        return itemList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_item, parent, false);
            holder = new ViewHolder();
            holder.textView1 = convertView.findViewById(R.id.textView1);
            holder.container = convertView.findViewById(R.id.container);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        Item item = itemList.get(position);
        holder.textView1.setText(item.getField1());

        // 清空容器中的子视图
        holder.container.removeAllViews();

        // 添加另一个自定义项目列表的子视图
        for (SubItem subItem : item.getSubItemList()) {
            View subItemView = inflater.inflate(R.layout.sub_item, holder.container, false);
            TextView textView2 = subItemView.findViewById(R.id.textView2);
            TextView textView3 = subItemView.findViewById(R.id.textView3);
            textView2.setText(subItem.getField2());
            textView3.setText(subItem.getField3());
            holder.container.addView(subItemView);
        }

        return convertView;
    }

    private static class ViewHolder {
        TextView textView1;
        LinearLayout container;
    }
}
  1. 在Activity中使用自定义适配器:
代码语言:java
复制
public class MainActivity extends AppCompatActivity {

    private ListView listView;
    private CustomAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = findViewById(R.id.listView);

        // 创建自定义项目列表数据
        List<Item> itemList = new ArrayList<>();
        itemList.add(new Item("项目1", Arrays.asList(
                new SubItem("子项目1", "字段A"),
                new SubItem("子项目2", "字段B")
        )));
        itemList.add(new Item("项目2", Arrays.asList(
                new SubItem("子项目3", "字段C"),
                new SubItem("子项目4", "字段D"),
                new SubItem("子项目5", "字段E")
        )));

        // 创建自定义适配器
        adapter = new CustomAdapter(this, itemList);

        // 设置适配器
        listView.setAdapter(adapter);
    }
}

这样,我们就实现了一个带有自定义项目的Android ListView,其中一个字段是另一个自定义项目列表。通过自定义适配器,我们可以在ListView中显示自定义项目,并在其中一个字段中显示另一个自定义项目列表。

请注意,以上示例中的布局文件和适配器仅供参考,您可以根据自己的需求进行修改和优化。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Android开发笔记(三十八)列表类视图

    AdapterView顾名思义是适配器视图,Spinner、ListView和GridView都间接继承自AdapterView,这三个视图都存在多个元素并排展示的情况,所以需要引入适配器模式。 适配器视图的特点有: 1、定义了适配器的设置方法setAdapter,以及获取方法getAdapter。适配器用于传入视图展示需要的相关数据。 2、定义了一个数据观察者AdapterDataSetObserver,用于在列表数据发生变化时,可以通过notifyDataSetChanged方法来更新视图。 3、定义了单个元素的点击、长按、选中事件。其中点击方法为setOnItemClickListener,点击监听器为OnItemClickListener;长按方法为setOnItemLongClickListener,长按监听器为OnItemLongClickListener;选中方法为setOnItemSelectedListener,选中监听器为OnItemSelectedListener。

    02

    Android开发笔记(二十二)瀑布流网格WaterfallGridView

    Android中展示门类信息一般使用列表视图ListView或者网格视图GridView,特别是电商类APP的首页,除了顶部导航、底部标签、上方横幅外,主要页面都是展示各种商品和活动的网格视图。一般情况下GridView就够用了,不过GridView中规中矩,每个网格的大小都是一样的,有时显得有些死板。比如不同商品的外观尺寸很不一样,冰箱是高高的在纵向上长,空调则是在横向上长,所以若用一样规格的网格来展示,必然有的商品图片被压缩得很小。再比如像新闻摘要,每篇摘要的字数都不一样,为了把文字显示完全,也需要对每个网格自适应高度,字数多的网格分配较小的高度,字数较多的网格分配较大的高度。可惜GridView不支持自适配网格高度,所以我们得自己写个瀑布流网格控件来实现这样的效果了。 先来理下瀑布流控件的思路,因为GridView每个网格的宽和高都是一样的,所以无法基于GridView进行改造。如果是ListView,每行高度一样,一行内每个元素的长度是可以自定义的,但每列元素的长度必须一样,所以改造ListView的效果也很有限。改造GridView也不行,改造ListView也不行,看来得换个思路了,把复杂问题简单化试试。例如这个页面上只有四个视图:左上区块0、右上区块1、左下区块2、右下区块3,直接用布局文件xml编写的话也不难,可能大家多半会想到采用相对布局RelativeLayout来处理。

    06

    Android开发笔记(十二)测量尺寸与下拉刷新

    大家知道,自定义视图的目的就是要在屏幕上显示期望的图案,那在绘制图案之前,我们得先知道这个图案的尺寸(如宽多少高多少)。 一般在xml中给控件的宽和高有三种赋值方式: 1、MATCH_PARENT : 表示与上级控件一样大小; 2、WRAP_CONTENT : 表示按照自身尺寸进行适配; 3、直接赋给具体的dp值; 方式3有具体的数值,不用计算就知道了。方式1与上级控件保持一致,因此只要系统依次丈量控件大小,这也不是什么难事。麻烦的是方式2,因为下级控件每个尺寸都有可能不确定,比如文本控件得看文字大小、行数,图像控件得看图片大小、拉伸情况,所以大家想想,如果这时候我们自己去一个个算过去(下级控件的个数也不确定),这算得头都大了。 幸亏Android提供了onMeasure函数自动完成了上述计算过程,通常情况下我们的自定义控件也无需重写该方法,除了一些特殊的情况。当然本文讲的便是实际开发中遇到的特殊情况,否则就不用浪费口舌了。

    04
    领券