鸿蒙列表,类似于安卓的RecyclerView

鸿蒙中想要实现安卓的RecyclerView效果,对于安卓开发者来说还是比较容易的的,基本写法如下:

首先在布局文件中声明

        <ListContainer
            ohos:id="$+id:lc_list"
            ohos:top_margin="20vp"
            ohos:height="40vp"
            ohos:start_margin="150vp"
            ohos:end_margin="150vp"
            ohos:orientation="horizontal"
            ohos:width="match_parent"/>

从上述代码中看到 有一个 orientation 属性,那就说明鸿蒙中的列表滑动方向是可以在控件中直接声明的

鸿蒙中的列表也需要适配器如下:
可以看到也可以写一个 ViewHolder 来做数据缓冲,这里的布局文件就不写出来了,和安卓一样的,查找控件,根据逻辑赋值处理

public class DeviceTAdapter extends RecycleItemProvider {

    private List<String> data;
    LayoutScatter layoutScatter;

    public DeviceTAdapter(Context context, List<String> data) {
        this.data = data;
        this.layoutScatter = LayoutScatter.getInstance(context);
    }

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

    public Object getData(){
        return  data;
    }

    @Override
    public Object getItem(int i) {
        if (data != null && i >= 0 && i < data.size()) {
            return data.get(i);
        }
        return null;
    }

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

    @Override
    public Component getComponent(int i, Component component, ComponentContainer componentContainer) {
        ViewHolder viewHolder = null;
        if (component == null) {
            component = layoutScatter.parse(ResourceTable.Layout_item_device_title, null, false);
            viewHolder = new ViewHolder((ComponentContainer) component);
            component.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) component.getTag();
        }

        String mD = data.get(i);

        viewHolder.tvItemName.setText(mD);
        return component;
    }

    static class ViewHolder {
        Text tvItemName;

        public ViewHolder(ComponentContainer componentContainer) {
            tvItemName = (Text) componentContainer.findComponentById(ResourceTable.Id_text_name);
        }
    }
}

在 AbilitySlice 找到我们的列表控件,添加适配器即可

        ListContainer  lcList = (ListContainer) findComponentById(ResourceTable.Id_lc_list);
        DeviceTAdapter mAdapter = new DeviceTAdapter(DeviceAbilitySlice.this,areaLists);
        lcList.setItemProvider(mAdapter);
        lcList.setItemClickedListener(new ListContainer.ItemClickedListener() {
            @Override
            public void onItemClicked(ListContainer listContainer, Component component, int i, long l) {
                //更新选中样式
                ArrayList<AreaList> mData = (ArrayList<AreaList>) mAdapter.getData();
                for (AreaList device: mData){
                    device.setSelect(false);
                }
                AreaList areaList = mData.get(i);
                areaList.setSelect(true);
                mAdapter.notifyDataChanged();
            }
        });

通过上述代码可以看到,列表的点击事件通过 列表控件来获取,我一般在安卓开发中都是通过适配器来获取的,这边是有些区别的,刷新适配器同样也是有 notify 方法使用

根据源码可以看到

鸿蒙列表,类似于安卓的RecyclerView_第1张图片
这里也是支持对单个 item 操作的

那么列表想要实现 几行几列怎么实现呢,安卓可以动态设置布局管理器,我们鸿蒙当然也不例外,就项目而言,我想要实现 两行,每行显示四个如何实现呢

鸿蒙列表,类似于安卓的RecyclerView_第2张图片

        ListContainer lcList = (ListContainer) cpt.findComponentById(ResourceTable.Id_lc_list);

       
        TableLayoutManager layoutManager = new TableLayoutManager();
        layoutManager.setColumnCount(4);
        lcList.setLayoutManager(layoutManager);

通过上述代码可以看到我使用了 setColumnCount 方法,每行显示四个,此时我只要确保传入适配器的数量为八个就能实现 两行每行显示四个 总共八个子控件的效果,我们点开表格管理器看一下

鸿蒙列表,类似于安卓的RecyclerView_第3张图片

果然不出所料,我既然能设置每行数量,也是能设置列数的,这里等你深入探索了

以上就是我在鸿蒙项目如何使用列表的过程了~

你可能感兴趣的:(鸿蒙,harmonyos,android,华为)