在我的应用中,我有ExpandableListView
BaseExpandableListAdapter
。方法getChildView
如下所示:
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
MyCustomObject myObject = (MyCustomObject)getGroup(groupPosition)).getValue().get(childPosition);
if(convertView==null){
LayoutInflater inflater = (LayoutInflater) this.ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item, null);
}
TextView lbl = (TextView) convertView.findViewById(R.id.lbl);
lbl.setText(myObject.getText());
return convertView;
}
我想根据myObject
上的属性更改布局的背景(和其他功能)。我的第一次尝试是定义一个不同的样式并尝试动态地改变视图的样式,但这是不可能的。
实现这一目标的最佳和最有效的方法是什么?
谢谢!
答案 0 :(得分:1)
您可以动态执行此操作而不会出现任何问题。非正式地说,您在convertView
实例中拥有整个行布局。如果您想更改背景,请致电convertView.setBackground(...)
。如果您的布局中有更多元素,只需使用convertView.findElementById(R.id...)
获取它们,然后将它们作为您需要的更改。
答案 1 :(得分:0)
getChildView()
为您提供groupPosition
和childPosition
。为了确定哪一个是当前的“子View
”,您需要使用这两个参数(例如switch
groupPosition
并创建与您拥有的组一样多的案例)。在每种情况下,您将为该行充气并返回相应的View
,并使用myObject
设置要在行的相应子项中显示的任何值。
答案 2 :(得分:0)
以下是我通常做的事情:
首先制作一个list_item.xml文件:
<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal">
<LinearLayout android:id="@+id/colorBar"
android:layout_height="match_parent"
android:layout_width="32dp"
android:orientation="vertical"/>
<TextView
android:id="@+id/mytextView1"
android:layout_marginLeft="32dp"
android:layout_height="wrap_content"
android:layout_width="match_parent"/>
</LinearLayout>
然后在BaseExpandableListAdapter中创建一个类:
public static class Row{
LinearLayout m_llColorBar;
TextView m_myTextView;
}
在你的getChildView()方法
中执行此操作@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent)
{
// Row Class reference
Row curRow;
// Reference to your custom object Parent
MyCustomObject myObject = (MyCustomObject)getGroup(groupPosition)).getValue().get(childPosition);
// Context should be passed into Constructor
LayoutInflater inflater = context.getLayoutInflater();
// If convertView is null, we need to create a new Child Layout
if(convertView == null)
{
curRow = new Row();
convertView = inflater.inflate(R.layout.list_item, null);
curRow.m_llColorBar = (LinearLayout) convertView.findViewById(R.id.colorBar);
curRow.m_myTextView = (TextView) convertView.findViewById(R.id.myTextView1);
// Sets a unique tag for the current row
convertView.setTag(curRow);
// Else,
}else{
// Recycle the view
curRow = (Row) convertView.getTag();
}
// Set the Text View to the Object's Text
curRow.m_myTextView.setText(myObject.getText());
// If the Object's Text is Some value
if(myObject.getText().equals("Some Value")){
// Make the Bar the Dark Holo Blue
curRow.m_llColorBar.setBackground(context.getResources().getColor(
android.R.color.holo_blue_dark));
}else if(myObject.getText().equals("Some Other Value")){
// Make the Bar the Dark Holo Orange
curRow.m_llColorBar.setBackground(context.getResources().getColor(
android.R.color.holo_orange_dark));
}else{
// Make the Bar the Dark Holo Red
curRow.m_llColorBar.setBackground(context.getResources().getColor(
android.R.color.holo_red_dark));
}
// Return the View
return convertView;
}
这说明了如何根据内容使您的行项看起来不同。
您可以使用任何窗口小部件执行此操作因此,假设您有一个ImageView
,并且您可能希望根据该内容将多个图像包含在您的行中。只需将ImageView
引用添加到Simple Class
行,然后使用if语句根据对象中的文本动态添加新的ImageView
src。