在 android 中以编程方式加载大量视图?

loading high amounts of views programmatically in android?

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

我知道这样做很混乱,而且可能是最糟糕的方法。我查找了不同的东西,其中大部分与列表视图相关,例如无尽的适配器或延迟加载。我不认为 listview 将适用于我正在尝试做的事情。我这样做有内存问题。

So I guess what my question is will ListView be the right direction to go? Will i still be able to use my for-for-for loops?

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

"So I guess what my question is will ListView be the right direction to go? Will i still be able to use my for-for-for loops?"

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

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

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

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

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

使用 ListView and defining different types of AdapterView 你应该能够做你需要的。

例如,假设每个红色框是一个 AdapterView. So from your scheme you'll have 2 AdapterView, lets call them "ViewOneBlueTwoBlack" and "ViewOneBlueThreeBlack". Also lets say you have more types of AdapterViews "ViewTwoBlueTwoBlack"、"ViewTwoBlueFiveBlack" 等... 现在您需要做的是在您的 Adapter 中处理条件,以了解何时应该加载每种类型的 AdapterView。

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

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

而且你的方案看起来很像 ExpandableListView 检查一下以防万一。

你绝对应该使用 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中访问数据时要小心,postion是ListView中的位置。