【问题标题】:add view in linearlayout programmatically working slowly以编程方式在线性布局中添加视图工作缓慢
【发布时间】:2018-08-03 08:16:08
【问题描述】:

我的目标是在 LinearLayout 中添加我的自定义视图。我有自定义 arrayList,我想使用 for 循环添加自定义视图。这是我的代码 sn-p

    public void replaceCustomView() {
    for (int i = 0; i < insertDataItems().size(); i++) {
        final LayoutInflater inflater = LayoutInflater.from(this);
        final View reView = inflater.inflate(R.layout.item_parent_child_listing, null, false);
        final TextView parentName = reView.findViewById(R.id.tv_parentName);
        final ImageView headerImageView = reView.findViewById(R.id.header_imageView);
        final LinearLayout linearLayout_childItems = reView.findViewById(R.id.ll_child_items);
        final RelativeLayout headerLayout = reView.findViewById(R.id.header_layout);
        final RelativeLayout headerImageLayout = reView.findViewById(R.id.header_image_layout);

        parentName.setText(insertDataItems().get(i).getParentName());

        if (insertDataItems().get(i).getChildDataItems() != null) {
            headerImageLayout.setVisibility(View.VISIBLE);
            headerImageLayout.setVisibility(View.VISIBLE);
            for (int j = 0; j < insertDataItems().get(i).getChildDataItems().size(); j++) {
                final LayoutInflater childInflater = LayoutInflater.from(this);
                final View childView = childInflater.inflate(R.layout.z_history_child_item, null, false);

                final TextView key = childView.findViewById(R.id.u_key);
                final TextView value = childView.findViewById(R.id.u_value);
                key.setText(insertDataItems().get(i).getChildDataItems().get(j).getKey());
                value.setText(insertDataItems().get(i).getChildDataItems().get(j).getValue());
                linearLayout_childItems.addView(childView);

            }
        } else {
            headerImageLayout.setVisibility(View.GONE);
            headerLayout.setBackgroundColor(Color.parseColor("#e8e8e8"));
        }
        linearLayout_childItems.setVisibility(View.GONE);

        if (insertDataItems().get(i).getParentName().length() > 0) {
            if (insertDataItems().get(i).isAllowDisable()) {
                headerImageView.setVisibility(View.GONE);
                linearLayout_childItems.setVisibility(View.VISIBLE);
            } else {
                headerImageView.setVisibility(View.VISIBLE);
                linearLayout_childItems.setVisibility(View.GONE);

            }


        } else {
            linearLayout_childItems.setVisibility(View.VISIBLE);
            headerLayout.setVisibility(View.GONE);
        }
        replaceLayout.post(() -> replaceLayout.addView(reView));

    }
}

我这样称呼这个函数

 runOnUiThread(() -> replaceCustomView());

自定义视图添加成功,但我的问题是第一次活动很慢。Android需要很多时间来添加视图。我的自定义数组的大小是20。是否可以逐步添加视图,不是每次都添加所有视图? 什么是最佳做法? 谢谢

【问题讨论】:

  • 例如是什么原因让你不使用RecyclerView?
  • 也许你是对的,但正如你所见,我有第二个 for 循环和第二个子视图。我尝试了 RecyclerView,但在滚动时,第二个 childViews 在上下滚动时被复制
  • 你能解释一下你想要实现的层次结构吗,所以我可以建议一个更好的方法来实现这一点。

标签: java android android-animation android-linearlayout


【解决方案1】:

当项目较多时,请不要使用添加运行时组件的概念。这将导致活动与视图呈现逻辑共享内存,您将能够回收视图。这种实现只能在项目很少(可能是 2 到 5 个)的情况下使用,并且由于某些 UI 限制无法使用 recyclerview 实现。

因此使用 RecyclerView 加载项目,您可以使用在子项目中添加自定义项目的概念来实现此功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    相关资源
    最近更新 更多