我有一个查询数据库并获取记录集的应用程序,在显示器上,我需要使用一个复杂布局的行来呈现这些数据。每行包含一些ImageView,许多TextView等......
以编程方式创建行布局真的很困难,有没有办法从xml中获取整个行布局(行布局的容器和子行),编辑一些属性(如行布局的TextViews)并将结果添加到LinearLayout?
答案 0 :(得分:10)
有没有办法从xml获取整个行布局(行布局的容器和子项)
您要找的是如何inflate
一个视图(LayoutInflator)
现在您拥有了正确的术语,应该很容易找到示例,inflate
在ListView
教程中很受欢迎。有关示例,请参阅本教程中的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
范例做很多事情(包括自定义行),例如将ListView
与SimpleCursorAdapter
一起使用。它可以通过调查来节省一些代码。有人在这里喋喋不休地说:
答案 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");