为每条记录重复一个复杂的布局

时间:2011-01-25 11:41:28

标签: android xml layout

我有一个查询数据库并获取记录集的应用程序,在显示器上,我需要使用一个复杂布局的行来呈现这些数据。每行包含一些ImageView,许多TextView等......

以编程方式创建行布局真的很困难,有没有办法从xml中获取整个行布局(行布局的容器和子行),编辑一些属性(如行布局的TextViews)并将结果添加到LinearLayout?

3 个答案:

答案 0 :(得分:10)

  

有没有办法从xml获取整个行布局(行布局的容器和子项)

您要找的是如何inflate一个视图(LayoutInflator

现在您拥有了正确的术语,应该很容易找到示例,inflateListView教程中很受欢迎。有关示例,请参阅本教程中的getView()以获取示例:

HowTo:ListView,适配器,getView和不同列表项的布局在一个ListView中 http://android.amberfog.com/?p=296

mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
...
convertView = mInflater.inflate(R.layout.item1, null);

  

...编辑一些属性(比如行布局的TextViews)......

一旦您为视图充气,您就可以搜索其中的小部件,以便您可以对其进行操作。

  

holder.textView =(TextView)convertView.findViewById(R.id.text);

如果您的视图相当复杂和/或您经常会在其中查找小部件,我想指出ViewHolder技术,如下面的相关位所示:

// Data structure to save lookups
public static class ViewHolder {
    public TextView textView;
}
...
// Save lookups to widgets for this view in ViewHolder in tag
ViewHolder holder = new ViewHolder();
holder.textView = (TextView) convertView.findViewById(R.id.text);
view.setTag(holder);
...
// Grab saved widgets - no need to search tree for them via lookup again
ViewHolder holder = (ViewHolder) convertView.getTag();
holder.textView.setText(mData.get(position));

  

...并将结果添加到LinearLayout?

据推测,您已经以编程方式添加到LinearLayout,但如果您想查看一些代码,这里有一个显示设置一些布局参数的示例:

Android LinearLayout
http://developerlife.com/tutorials/?p=312

  // main "enclosing" linearlayout container - mainPanel
  final LinearLayout mainPanel = new LinearLayout(ctx);
  {
    mainPanel.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                                               LayoutParams.FILL_PARENT));
    mainPanel.setOrientation(LinearLayout.VERTICAL);
    ...
  }
  ...
  // top panel
  LinearLayout topPanel = new LinearLayout(ctx);
  {
    // WEIGHT = 1f, GRAVITY = center
    topPanel.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                                              LayoutParams.WRAP_CONTENT,
                                              1));
    ...
  }
  ...
  // bottom panel
  LinearLayout bottomPanel = new LinearLayout(ctx);
  {
    LayoutUtils.Layout.WidthFill_HeightWrap.applyLinearLayoutParams(bottomPanel);
    ...
  }
  ...    
  // add the panels
  mainPanel.addView(topPanel);
  mainPanel.addView(bottomPanel);
  ...

最后,您可以使用AdapterView / Adapter范例做很多事情(包括自定义行),例如将ListViewSimpleCursorAdapter一起使用。它可以通过调查来节省一些代码。有人在这里喋喋不休地说:

Android ListView with different layouts for each row

答案 1 :(得分:4)

根据经验,每当您使用代码创建View的实例时,请三思而后行。

查看LayoutInflater有关如何从资源创建布局的信息。在您的特殊情况下,如果您想在ResourceCursorAdapter中显示多行,则可能还需要检查ListView

答案 2 :(得分:0)

您使用的是哪种表格?如果你的布局是这样的:

<TableLayout>
  <LinearLayout android:id="@+id/linearLayoutTest">
    <TextView/>  
    <TextView ....
    <ImageView .... 
  </LinearLayout>
  <LinearLayout ....
</TableLayout>

通过id访问行容器很容易,然后按位置查找所需的子项:

LinearLayout linearLayout = (LinearLayout)this.findViewById(R.id.linearLayoutTest);
TextView textView = (TextView)linearLayout.getChildAt(0);
textView.setText("New Text");