在ListView项中重用动态视图

时间:2016-05-18 14:28:10

标签: android listview android-recyclerview

在Android中,ListViewRecyclerView会在用户滚动以通过不反复膨胀/创建视图对象来提高效率时重复使用视图对象。

这对于任何简单的列表都是直截了当的,但我的用例有点不同。列表中的每个项目都有另一个项目列表,您可以将其视为帖子列表,每个帖子都有一个标签列表。它可以看作如下:

-------------
Post 1
<Tag1> <Tag2> <Tag3>
-------------
Post 2
<Tag4>
-------------
Post 3
<Tag5> <Tag6>
-------------

由于每个帖子都有可变数量的标签,如果我们想在不同的ListView项目中重复使用set标签视图对象,那就不那么简单了。

我目前解决这个问题的方法是,ReusableViewPool的实现在上述情况下充当可重用标记视图对象的池,其中每个ListView项可以从池中获取视图对象并返回未使用的视图对象回到游泳池。界面如下:

public interface ReusableViewPool {
    View get();
    void recycle(View v);
}

ListAdapterRecyclerView.Adapter中,它的作用类似于:

public View getView(int position, View convertView, ViewGroup parent) {
    // return extra tag views to the pool
    // add missing tag views from the pool
    // update the tag views
}

该方法运行良好,但我认为这对于一个常见问题来说非常麻烦。

所以问题是,你们采取什么方法来解决问题?你有什么优雅的解决方案吗?

感谢。

1 个答案:

答案 0 :(得分:1)

我过去曾使用过这种技术,我认为这是一种有效的设计。

在您的情况下,我可能会考虑采用不同的方法:使用单个TextView并制作包含所有标记名称的单个SpannableString,标记为正确的外观。但很多方面取决于您的实施:

  1. 布局/溢出 - 标记部分是否具有某种流布局,或者您是否有水平滚动以将所有标记保留在一行中?

  2. 图形 - 你是否在名字之间插入了图标?根据标签类型,它们有不同的颜色或形状吗?

  3. 排版 - 根据标签类型,标签名称是否有不同的样式或颜色?

  4. 如果您使用某些详细信息更新您的问题,并且更喜欢某些图片/屏幕截图,我可以添加一些示例代码。