【问题标题】:loading high amounts of views programmatically in android?在android中以编程方式加载大量视图?
【发布时间】:2015-07-03 08:40:05
【问题描述】:

我在 for 循环中的 for 循环中有一个 for 循环(3 个 for 循环)。每个 for 循环在其中加载至少一个视图,其中一些加载超过 1。所有视图(文本视图、图像视图)都加载到相对布局或线性布局中,并且这些布局都加载到一个线性布局中,所有这些都是在滚动视图中。

我知道这样做令人困惑并且可能是最糟糕的方法。我查找了不同的东西,其中大多数与列表视图相关,例如无限适配器或延迟加载。我不认为 listview 将适用于我正在尝试做的事情。我这样做有记忆问题。

所以我想我的问题是 ListView 是正确的方向吗?我还能使用我的 for-for-for 循环吗?

考虑每个块代表一个布局(每个布局由 textviews 组成,只有黑框有 imageviews 和 textviews)并且还考虑每个颜色代表一个 for 循环。黑色边框代表所有这些视图和其他布局都被推入的线性布局。请记住,红框和蓝框下方的黑框数量并不总是相同

【问题讨论】:

    标签: android android-layout for-loop android-listview android-view


    【解决方案1】:

    我不知道我是否真的得到了你想要的东西,但我认为你应该使用Adapter

    按照您所说的对布局执行此操作会导致内存问题,因为您正在加载复杂的视图层次结构,android 正在绘制所有视图(甚至是那些还不可见的视图)并且您的视图都没有被重用。

    使用ListView 并定义不同类型的AdapterView,您应该能够做您需要的事情。

    例如,假设每个红色框是一个AdapterView。因此,从您的方案中,您将拥有 2 个AdapterView,我们称它们为“ViewOneBlueTwoBlack”和“ViewOneBlueThreeBlack”。还可以说您有更多类型的AdapterViews“ViewTwoBlueTwoBlack”、“ViewTwoBlueFiveBlack”等... 现在你需要做的是在你的 Adapter 中处理条件以知道何时应该加载每种类型的 AdapterView。

    如果您认为红框是部分,然后蓝框成为您的AdapterViews,则更好。

    您可以在这里找到关于ListViewsAdapter 的精彩教程:http://www.vogella.com/tutorials/AndroidListView/article.html

    你的方案看起来很像ExpandableListView,以防万一。

    【讨论】:

    • 我喜欢你创建不同适配器视图的想法,我可能最终会这样做。 expandablelistview 是一些相关但 expandablelistview 似乎创建了我不想要的下拉项目。
    • 您可以在不使用折叠功能的情况下使用 ExpandableListView,请查看stackoverflow.com/questions/6978434/…。在stackoverflow.com/a/29834484/665823 中,您可以找到一个实现和它的外观图片。你会明白为什么你的计划让我想到了这一点;)
    【解决方案2】:

    您绝对应该使用 ListView 和 adpater。

    您可以在 ListView 中使用不同的视图类型。为此,您应该有一个这样的适配器:

    public class YourAdapter extends BaseAdapter {
         private static int HEADER_TYPE = 0;
         private static int CONTENT_TYPE_1 = 1;
         private static int CONTENT_TYPE_2 = 2;
    
         @Override
         public int getViewTypeCount() {
              return 3;
         }
    
         @Override
         public int getItemViewType(int position) {
              if (header)
                  return HEADER_TYPE;
              else if (content_type_1)
                  return CONTENT_TYPE_1;
              else
                  return CONTENT_TYPE_2;
          }
    
          @Override
          public View getView(int position, View convertView, ViewGroup parent) {
               if (getItemViewType(position) == HEADER_TYPE) {
                       //make header view
               } else if (getItemViewType(position) == CONTENT_TYPE_1 {
                      //make content view
                      //be careful position is the position in the list view
               } else {
                      //make content view
                      //be careful position is the position in the list view
               return convertView;
          }
    }
    

    在getView中访问数据时要小心,位置是ListView中的位置。

    【讨论】:

      【解决方案3】:

      我建议您为此使用表格布局。在 xml 文件中声明表格布局,并动态添加视图。

      我给出了类似的答案here,您可以自定义解决方案,使其在一行中只有一个视图并相应地对齐。

      【讨论】:

        【解决方案4】:

        “所以我想我的问题是 ListView 是正确的方向吗?我还能使用我的 for-for-for 循环吗?”

        答案是,正确的方向取决于您的场景,如果您的目标可以同时实现,那么看看哪种方法的视图或小部件最少,在您的情况下有很多布局,但如果您使用 ListView,可能会有一个。 Bt 在开发中最好的方式是满足客户要求的任何方式..

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多