1. 一个界面布局,list有一级跟二级目录,用到ExpandableListView。使用此ListView,需要定义一个界面布局,一个一级目录布局和一个二级目录布局。可使用SimpleExpandableListAdapter去适配。要更多功能,比如修改一级目录图标,可自定义adapter。
要去掉ExpandableListView一级目录自带图标,只需设置ExpandableListView属性
android:groupIndicator="@null"
(1)遇到问题:ExpandableListView一级目录自带的图标修改成自定义图标出错
原因:SimpleExpandableListAdapter会将所有传进来的控件转换成TextView,导致ClassCastException。
这是SimpleExpandableListAdapter的内部实现方法
private void bindView(View view, Map<String, ?> data, String[] from, int[] to) { int len = to.length; for (int i = 0; i < len; i++) { TextView v = (TextView)view.findViewById(to[i]); if (v != null) { v.setText((String)data.get(from[i])); } } }
这样修改bindView方法即可
public class MyExpandListAdapter extends BaseExpandableListAdapter { private ViewBinder mViewBinder; private List<? extends Map<String, ?>> mGroupData; private int mExpandedGroupLayout; private int mCollapsedGroupLayout; private String[] mGroupFrom; private int[] mGroupTo; private List<? extends List<? extends Map<String, ?>>> mChildData; private int mChildLayout; private int mLastChildLayout; private String[] mChildFrom; private int[] mChildTo; private LayoutInflater mInflater; public MyExpandListAdapter(Context context, List<? extends Map<String, ?>> groupData, int groupLayout, String[] groupFrom, int[] groupTo, List<? extends List<? extends Map<String, ?>>> childData, int childLayout, String[] childFrom, int[] childTo) { this(context, groupData, groupLayout, groupLayout, groupFrom, groupTo, childData, childLayout, childLayout, childFrom, childTo); } public MyExpandListAdapter(Context context, List<? extends Map<String, ?>> groupData, int expandedGroupLayout, int collapsedGroupLayout, String[] groupFrom, int[] groupTo, List<? extends List<? extends Map<String, ?>>> childData, int childLayout, String[] childFrom, int[] childTo) { this(context, groupData, expandedGroupLayout, collapsedGroupLayout, groupFrom, groupTo, childData, childLayout, childLayout, childFrom, childTo); } public MyExpandListAdapter(Context context, List<? extends Map<String, ?>> groupData, int expandedGroupLayout, int collapsedGroupLayout, String[] groupFrom, int[] groupTo, List<? extends List<? extends Map<String, ?>>> childData, int childLayout, int lastChildLayout, String[] childFrom, int[] childTo) { mGroupData = groupData; mExpandedGroupLayout = expandedGroupLayout; mCollapsedGroupLayout = collapsedGroupLayout; mGroupFrom = groupFrom; mGroupTo = groupTo; mChildData = childData; mChildLayout = childLayout; mLastChildLayout = lastChildLayout; mChildFrom = childFrom; mChildTo = childTo; mInflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public Object getChild(int groupPosition, int childPosition) { return mChildData.get(groupPosition).get(childPosition); } public long getChildId(int groupPosition, int childPosition) { return childPosition; } /** * Instantiates a new View for a child. * * @param isLastChild * Whether the child is the last child within its group. * @param parent * The eventual parent of this new View. * @return A new child View */ public View newChildView(boolean isLastChild, ViewGroup parent) { return mInflater.inflate((isLastChild) ? mLastChildLayout : mChildLayout, parent, false); } public int getChildrenCount(int groupPosition) { return mChildData.get(groupPosition).size(); } public Object getGroup(int groupPosition) { return mGroupData.get(groupPosition); } public int getGroupCount() { return mGroupData.size(); } public long getGroupId(int groupPosition) { return groupPosition; } /** * Instantiates a new View for a group. * * @param isExpanded * Whether the group is currently expanded. * @param parent * The eventual parent of this new View. * @return A new group View */ public View newGroupView(boolean isExpanded, ViewGroup parent) { return mInflater.inflate((isExpanded) ? mExpandedGroupLayout : mCollapsedGroupLayout, parent, false); } public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } public boolean hasStableIds() { return true; } private void bindView(View view, Map<String, ?> data, String[] from, int[] to) { int len = to.length; boolean isBound = false; for (int i = 0; i < len; i++) { final View v = view.findViewById(to[i]); if (v != null) { final Object _data = data.get(from[i]); String text = _data == null ? "" : data.toString(); if (text == null) { text = ""; } if (mViewBinder != null) {// 如果Binder不为空,使用Binder进行处理 isBound = mViewBinder.setViewValue(v, data.get(from[i]), text); } if (!isBound) {// 如果Binder跳过,使用原来的方法进行处理 TextView _v = (TextView) v; _v.setText((String) data.get(from[i])); } } } } public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { View v; if (convertView == null) { v = newGroupView(isExpanded, parent); } else { v = convertView; } bindView(v, mGroupData.get(groupPosition), mGroupFrom, mGroupTo); return v; } public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { View v; if (convertView == null) { v = newChildView(isLastChild, parent); } else { v = convertView; } bindView(v, mChildData.get(groupPosition).get(childPosition), mChildFrom, mChildTo); return v; } public void setViewBinder(ViewBinder mViewBinder) { this.mViewBinder = mViewBinder; } /** * 提供视图渲染的绑定器 * * @author Atomic */ public static interface ViewBinder { boolean setViewValue(View view, Object data, String textRepresentation); }
代码摘自http://www.eoeandroid.com/code/2011/1202/220.html
修改完以后,可以在Activity代码中像SimpleExpandableListAdapter一样使用。在一级目录的布局中就可以新添加ImageView属性,使用自定义的图标了。
public class ProjectTableExActivity extends Activity { private ExpandableListView lv; // private SimpleExpandableListAdapter adapter; private MyExpandListAdapter adapter1; private List<List<Map<String, Object>>> child; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.project_table_expandlist); child = new ArrayList<List<Map<String, Object>>>(); lv = (ExpandableListView) findViewById(R.id.projectTabExpandList); adapter1 = new MyExpandListAdapter(this, groupData(new String[] { "你好","我好","大家好" }), R.layout.project_table_item, new String[] { "img", "text" }, new int[] { R.id.item_img2, R.id.item_txt3 }, child, R.layout.project_table_child, new String[] {}, new int[] {}); adapter1.setViewBinder(new MyExpandListAdapter.ViewBinder() { @Override public boolean setViewValue(View view, Object data, String textRepresentation) { switch (view.getId()) { case R.id.item_img2: {//要替换成的图标的Id if (view instanceof ImageView) { ImageView _view = (ImageView) view; if (data instanceof Integer) { _view.setImageResource((Integer) data); } else if (data instanceof Drawable) { _view.setImageDrawable((Drawable) data); } else { throw new IllegalArgumentException( "The Data is Not a Drawable Or Resource Id!"); } } return true; } } return false; } }); lv.setAdapter(adapter1); } private List<? extends Map<String, ?>> groupData(String[] str) { ArrayList<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); // Field field; try { for (int i = 0; i < str.length; i++) { Resources res = getResources(); int lable = res.getIdentifier("cv_lable" + (i + 1), "drawable", getPackageName()); /* * field = R.drawable.class.getField("R.drawable.cv_lable" + (i * + 1)); int lable = field.getInt(new R.drawable()); */ Map map = new HashMap<String, Object>(); map.put("img", lable); map.put("text", str[i]); list.add(map); List<Map<String, Object>> child1 = new ArrayList<Map<String, Object>>(); Map<String, Object> childdata = new HashMap<String, Object>(); child1.add(childdata); child.add(child1); } } catch (Exception e) { e.printStackTrace(); } return list; } }
注意取得lable的方法
(2)遇到问题:二级目录打不开
原因:在一级目录中有按钮控件存在
给按钮控件添加属性
android:focusable="false"
2.自定义EditText的背景图和边框
背景图可直接修改EditText的background
新建类继承自EditText,绘制边框
public class MyEditText extends EditText { public MyEditText(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setStyle(Style.STROKE); paint.setStrokeWidth(2); if (this.isFocused() == true) paint.setColor(Color.parseColor("#D9DAD4")); else paint.setColor(Color.parseColor("#D9DAD4")); canvas.drawRoundRect( new RectF(this.getScrollX(), this.getScrollY(), this .getWidth() + this.getScrollX(), this.getHeight() + this.getScrollY() ), 3, 3, paint); super.onDraw(canvas); } }
代码源自网络
在xml中引用时直接使用这个自定义的EditText即可【全类名】
相关推荐
使用ExpandableListView打造的可折叠的多条目布局的效果,每个Item里面的布局都可以自己定义,并且扩展了ExpandableListView的功能添加了折叠动画的效果。 项目使用AS2.3和gradle_3.3构建 Github下载地址: ...
expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { if ...
expandableListView.setAdapter(new MyExpandableListAdapter(this, groupList)); ``` 以上就是关于`ExpandableListView`的核心知识点,它为Android应用提供了构建层级结构列表的强大工具。开发者可以根据实际需求...
expandableList.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { // 处理...
在实际项目中,`ExpandableListView`常用于创建如设置菜单、文件系统目录等场景。通过自定义适配器,我们可以实现各种样式和动画效果,提高用户体验。同时,`ExpandableListView`还可以与其他组件结合,如搜索栏,...
expandableListView.setAdapter(adapter); ``` 6. **事件监听** 可以通过`setOnChildClickListener`和`setOnGroupClickListener`来监听父项和子项的点击事件,以便进行相应的操作。 7. **自定义行为** 为了...
ExpandableListView中group和child自定义视图带CheckBox,实现child全选、部分选中功能,同时实现类似邮件群发的用户选择功能,选中的用户在EditText中显示,点击后移除. 更新: 1. ExpandableListView勾选后生成的...
expandableListView.setOnGroupClickListener(...); expandableListView.setOnChildClickListener(...); ``` **6. 展开和折叠操作** 你可以使用`expandGroup()`和`collapseGroup()`方法来控制父项的展开和折叠状态...
expandableListView.setOnChildClickListener(...); ``` 8. **CityListDemo项目** 提供的`CityListDemo`可能包含了实现上述步骤的代码示例。解压这个文件,你可以查看项目的结构,包括`MainActivity.java`(实现...
ExpandableListView中group和child自定义视图带CheckBox,实现child全选、部分选中功能,同时实现类似邮件群发的用户选择功能,选中的用户在EditText中显示,点击后移除. 更新: 1. ExpandableListView勾选后生成的...
expandableListView.setOnGroupClickListener(new OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { // 处理父项点击事件 ...
Android 音乐播放器 秒表源码 日历源码Android应用源码 27个合集.zip Android 音乐播放器(晴天播放)源码.rar Android录音程序源码.rar ...自定义适配器的ExpandableListView.rar 进度条对话框Demo源码.zip
expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { // ...
本文将深入探讨2013年01月03日发布的一个Android开发实例,该实例旨在模仿QQ应用中的ExpandableListView功能,并结合"源码"和"工具"这两个标签,我们将会看到如何通过代码来实现这一功能。 首先,...
在本项目"ExpandableListView.zip"中,我们可能找到了实现这一功能的具体源码,这将帮助我们更深入地理解如何在实际应用中操作和定制`ExpandableListView`。 首先,`ExpandableListView`是`ListView`的一个扩展,...
expandableListView.setOnGroupClickListener(...); expandableListView.setOnChildClickListener(...); ``` 其中,`MyExpandableListAdapter`需要实现`BaseExpandableListAdapter`,根据数据模型填充视图。 ...
expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { //...
这个压缩包文件"安卓Android源码——自定义适配器的ExpandableListView.zip"包含了一份关于如何在Android应用中自定义适配器以实现`ExpandableListView`功能的详细教程和示例代码。 首先,我们要理解`...
`ViewPager`和`ExpandableListView`是两个非常重要的组件,它们可以帮助我们构建出高效、流畅且功能丰富的界面。`ViewPager`用于实现页面间的滑动切换,而`ExpandableListView`则提供了一种展示层次结构数据的方式。...
expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int ...