【问题标题】:Android Expandable listAndroid 可扩展列表
【发布时间】:2011-09-25 23:12:01
【问题描述】:

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

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

我附上了我想要的图片。

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

请针对这种特定情况提出教程或代码逻辑。

【问题讨论】:

    标签: android expandablelistview


    【解决方案1】:

    您可以通过调用setGroupIndicator更改指标

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

    另外,您需要自己实现ExpandableListAdapter。有可能在其中夸大自己对父母和孩子的看法。

    【讨论】:

      【解决方案2】:

      与此同时 我创建了一个 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>
      

      android:groupIndicator="@drawable/selector" in xml 中给出——friend_small 和 place small 是我展开和折叠状态的图像

      【讨论】:

        【解决方案3】:

        在对可扩展列表进行研发后发现,可扩展列表视图是Android提供的两级树状视图。

        此视图包含两种类型的类别。

        第一种是Group-Elements,第二种是Child-Elements,也叫父子元素。

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

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

        下面的代码是 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 如下,其中包含可展开列表组视图结构的布局。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到activity类的引用。

         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 用于自定义视图。下面是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>
        

        【讨论】:

        • 在研发之后,我实现了一个代码,它使用带有父子布局的自定义可扩展列表作为我的 group_row。 XML 和 child_row。 XML。
        • 另外,将默认折叠和展开图像向右对齐...根据我的布局要求...
        • ExpandableListView 不能有子视图(在 xml 中)。
        • 至少不使用 android 4.1.2,我得到一个 UnsupportedOperationExcepction 因为它试图将 TextView 添加到 ExpandableListView。
        • @Pescis 到目前为止,自定义子视图布局不适用于所有 Api 级别。请确保,由于对 TextViews 的一些错误使用,您可能会得到 UnsupportedOperationExcepction。
        猜你喜欢
        • 2011-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-21
        • 1970-01-01
        相关资源
        最近更新 更多