ListViewAdapter用于行的不同样式

时间:2014-01-23 19:40:20

标签: android

在我的应用中,我有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上的属性更改布局的背景(和其他功能)。我的第一次尝试是定义一个不同的样式并尝试动态地改变视图的样式,但这是不可能的。

实现这一目标的最佳和最有效的方法是什么?

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以动态执行此操作而不会出现任何问题。非正式地说,您在convertView实例中拥有整个行布局。如果您想更改背景,请致电convertView.setBackground(...)。如果您的布局中有更多元素,只需使用convertView.findElementById(R.id...)获取它们,然后将它们作为您需要的更改。

答案 1 :(得分:0)

getChildView()为您提供groupPositionchildPosition。为了确定哪一个是当前的“子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;
}

这说明了如何根据内容使您的行项看起来不同。

  1. 只是一个包含UI元素的简单类
  2. 在getChildView()
  3. 中引用它
  4. 如果视图为空
  5. ,则将其初始化
  6. 使用视图获取商品
  7. 然后在你的getChildView()方法中使用for循环。
  8. 您可以使用任何窗口小部件执行此操作因此,假设您有一个ImageView,并且您可能希望根据该内容将多个图像包含在您的行中。只需将ImageView引用添加到Simple Class行,然后使用if语句根据对象中的文本动态添加新的ImageView src。