Android可扩展列表

时间:2011-06-30 12:40:06

标签: android expandablelistview

我正在尝试使用带有父XML和子XML的父级和子级布局的自定义ExpandableListView

我的数据将是服务器响应。所以我最好希望以父列表和子布局的数组列表或哈希映射的形式提供数据

我附上我想要的图像。

有没有办法通过任何+或 - UI表示来更改可扩展列表箭头图像(默认),如下所示。

List

List1

请针对此特定情况建议教程或代码逻辑。

3 个答案:

答案 0 :(得分:6)

经过R& D over expandable List我发现可扩展的List-view是Android提供的两级树视图。

此视图包含两种类别。

第一种类型是 组元素 ,第二种类型是 子元素 ,也称为父母和子女元件。

此示例的主要目的是自定义可展开列表视图,如问题所示。

我已经介绍了一些关于我在经历中遇到的可扩展列表视图的重要主题。

下面的代码是main.xml,包含可扩展的列表视图。 main.xml中

<!--?xml version="1.0" encoding="UTF-8"?-->
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">

     <expandablelistview android:id="@+id/android:list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:groupindicator="@drawable/group_indicator.xml">

     <textview android:id="@+id/android:empty" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="@string/main_no_items">       
</textview></expandablelistview></linearlayout>

group_row.xml如下所示,其中包含可扩展列表组视图structure.group_row.xml的布局     ?

     <textview android:id="@+id/tvGroupName" android:layout_width="wrap_content" android:layout_height="40dip" android:textsize="16sp" android:textstyle="bold" android:paddingleft="30dip" android:gravity="center_vertical">

child_row.xml这包含可扩展列表视图组结构的布局。 child_row.xml

<!--?xml version="1.0" encoding="utf-8"?-->
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="40dip" android:gravity="center_vertical">

    <textview android:id="@+id/tvPlayerName" android:paddingleft="50dip" android:textsize="14sp" android:layout_width="wrap_content" android:layout_height="30dip" android:gravity="center_vertical">

</textview></linearlayout>

首先阅读可扩展列表视图从xml到活动类的引用。

 public class ExpList extends ExpandableListActivity
    {
     /**
      * strings for group elements
      */
        static final String arrGroupelements[] = 
        {
       "India",
       "Australia",
       "England",
       "South Africa"
     };

        /**
      * strings for child elements
      */
     static final String arrChildelements[][] = 
     {
       {
      "Sachin Tendulkar",
      "Raina",
      "Dhoni",
      "Yuvi"
       },
       {
      "Ponting",
      "Adam Gilchrist",
      "Michael Clarke"
       },
       {
      "Andrew Strauss",
      "kevin Peterson",
      "Nasser Hussain"
       },
       {
      "Graeme Smith",
      "AB de villiers",
      "Jacques Kallis"
       }
        };

     DisplayMetrics metrics;
     int width;
     ExpandableListView expList;

        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            expList = getExpandableListView();
            metrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metrics);
            width = metrics.widthPixels;
            //this code for adjusting the group indicator into right side of the view


if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
            expList.setIndicatorBounds(width - GetDipsFromPixel(50), width - GetDipsFromPixel(10));
        } else {
            expList.setIndicatorBoundsRelative(width - GetDipsFromPixel(50), width - GetDipsFromPixel(10));
        }

            expList.setAdapter(new ExpAdapter(this));

      expList.setOnGroupExpandListener(new OnGroupExpandListener()
      {
       @Override
       public void onGroupExpand(int groupPosition) 
       {
        Log.e("onGroupExpand", "OK");
       }
      });

      expList.setOnGroupCollapseListener(new OnGroupCollapseListener()
      {
       @Override
       public void onGroupCollapse(int groupPosition) 
       {
        Log.e("onGroupCollapse", "OK");
       }
      });

      expList.setOnChildClickListener(new OnChildClickListener()
      {
       @Override
       public boolean onChildClick(ExpandableListView parent, View v,
         int groupPosition, int childPosition, long id) {
        Log.e("OnChildClickListener", "OK");
        return false;
       }
      });
        }

        public int GetDipsFromPixel(float pixels)
        {
         // Get the screen's density scale
         final float scale = getResources().getDisplayMetrics().density;
         // Convert the dps to pixels, based on density scale
         return (int) (pixels * scale + 0.5f);
        }
    }

为了自定义Exp Listview,主要的是适配器。 Android提供了BaseExpandableListAdapter来自定义视图。 Bellow是Adapter的设计代码。

这是用于构建组和子元素的可扩展列表视图的适配器。

public class ExpAdapter extends BaseExpandableListAdapter {

  private Context myContext;
  public ExpAdapter(Context context) {
   myContext = context;
  }
  @Override
  public Object getChild(int groupPosition, int childPosition) {
   return null;
  }

  @Override
  public long getChildId(int groupPosition, int childPosition) {
   return 0;
  }

  @Override
  public View getChildView(int groupPosition, int childPosition,
    boolean isLastChild, View convertView, ViewGroup parent) {

   if (convertView == null) {
    LayoutInflater inflater =  (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertView = inflater.inflate(R.layout.child_row, null);
   }

   TextView tvPlayerName = (TextView) convertView.findViewById(R.id.tvPlayerName);
   tvPlayerName.setText(arrChildelements[groupPosition][childPosition]);

   return convertView;
  }

  @Override
  public int getChildrenCount(int groupPosition) {
   return arrChildelements[groupPosition].length;
  }

  @Override
  public Object getGroup(int groupPosition) {
   return null;
  }

  @Override
  public int getGroupCount() {
   return arrGroupelements.length;
  }

  @Override
  public long getGroupId(int groupPosition) {
   return 0;
  }

  @Override
  public View getGroupView(int groupPosition, boolean isExpanded,
    View convertView, ViewGroup parent) {

   if (convertView == null) {
    LayoutInflater inflater =  (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertView = inflater.inflate(R.layout.group_row, null);
   }

   TextView tvGroupName = (TextView) convertView.findViewById(R.id.tvGroupName);
   tvGroupName.setText(arrGroupelements[groupPosition]);

   return convertView;
  }

  @Override
  public boolean hasStableIds() {
   return false;
  }

  @Override
  public boolean isChildSelectable(int groupPosition, int childPosition) {
   return true;
  }
 }

group_indicator.xml 这是用于更改默认指标图像的代码。

 <?xml version="1.0" encoding="UTF-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_expanded="true" android:drawable="@drawable/friend_small" />
        <item android:drawable="@drawable/place_small" />
    </selector>

答案 1 :(得分:5)

同时 我创建了一个selector.xml:

<?xml version="1.0" encoding="UTF-8"?>

<selector xmlns:android="schemas.android.com/apk/res/android" >

    <item
        android:drawable="@drawable/friend_small"
        android:state_expanded="true"/>

    <item android:drawable="@drawable/place_small"/>
</selector>

并在xml中的android:groupIndicator="@drawable/selector"中给出 - friend_small并且放置小的是展开和折叠状态的图像

答案 2 :(得分:3)

您可以致电setGroupIndicator

来更改指标
  

可扩展列表能够在每个项目旁边显示一个指示符,以显示项目的当前状态(状态通常是扩展组,折叠组,子项或最后一个项目之一)。使用setChildIndicator(Drawable)或setGroupIndicator(Drawable)(或相应的XML属性)来设置这些指标(请参阅每个方法的文档以查看每个Drawable可以具有的其他状态)。

另外,您需要自己实施ExpandableListAdapter。你可以为父母和孩子夸大自己的观点。