2011-06-30 105 views
11

我想在父级和子级布局中使用父级XML和子级XML的自定义ExpandableListViewAndroid可扩展列表

我的数据将是服务器响应。所以我最好希望以父列表布局或子布局的数组列表或散列表的形式存在数据。

我附上了我想要的图像。

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

List

List1

请提出这一具体情况的教程或代码的逻辑。

回答

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,并把小是我的扩大图像和折叠状态

3

您可以通过调用setGroupIndicator

扩展列表能够显示每个项目旁边的指示灯来显示该项目的当前状态(状态通常是扩大集团之一,倒塌组,儿童更改指标,或最后一个孩子)。使用setChildIndicator(Drawable)或setGroupIndicator(Drawable)(或相应的XML属性)来设置这些指标(请参阅每种方法的文档以查看每个Drawable可以具有的附加状态)。

此外,您还需要自己实施ExpandableListAdapter。对于父母和孩子都有可能夸大自己的观点。

6

一个后R & D over expandable List我发现可扩展列表视图是由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来自定义视图。波纹管是适配器设计的代码。

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

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> 
+0

经过研发我已经实现了一个代码,使用父母和孩子布局的自定义可扩展列表作为我的group_row。 XML和child_row。 XML。 –

+0

此外,,对齐默认的崩溃和展开图像正确...按照我的布局中所需... –

+0

ExpandableListView不能有子视图(在xml中)。 – ddmps