这些天想做一个嵌套GridView的ExpandableListView,就是说,点击ExpandableListView展开显示GridView,基本实现思路就是重写ExpandableListView的getChildView()函数,代码如下:
package com.ns.gridlist;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources.Theme;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ExpandableListView;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.SimpleCursorAdapter;
import android.widget.SimpleCursorTreeAdapter;
import android.widget.TextView;
/**
* @author xiaolifan 2011-12-22
* 嵌套显示GridView的ExpandableListView*/
public class GridListViewActivity extends Activity {
private ExpandableListView mExpandableListView;
/**
* 获取联系人ID的列位置,一般都是第一个,也就是0
*/
private int mGroupIdColumnIndex;
/**
* 要查询联系人的电话号码的字段(也就是子视图的信息)
*/
private String mPhoneNumberProjection[] = new String[] {
ContactsContract.CommonDataKinds.Phone._ID,
ContactsContract.CommonDataKinds.Phone.NUMBER, };
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mExpandableListView = (ExpandableListView) findViewById(R.id.expandableListView1);
// 查询联系人并获取其Cursor对象
Cursor groupCursor = managedQuery(
ContactsContract.Contacts.CONTENT_URI, new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME }, null, null,
null);
// 保存取联系人ID的列位置
mGroupIdColumnIndex = groupCursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID);
// 设置 adapter
MyExpandableListAdapter mAdapter = new MyExpandableListAdapter(
groupCursor, this,
R.layout.list_header_layout,// 组视图(联系人)
R.layout.list_grid_layout,// 子视图(电话号码)
new String[] { ContactsContract.Contacts.DISPLAY_NAME }, // 显示联系人名字
new int[] { R.id.textView1 },
new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER }, // 显示电话号码
new int[] { R.id.textView2 });
mExpandableListView.setAdapter(mAdapter);
mExpandableListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
// TODO Auto-generated method stub
}
});
}
/**
*
* 为ExpandableListView填充数据的Adapter类,在这里面我们实现了在ExpandableListView中嵌套显示Gridview的功能;
*
*/
private class MyExpandableListAdapter extends SimpleCursorTreeAdapter implements OnItemClickListener{
private int gridLayoutResId;
private LayoutInflater mLayoutInflater;
private Cursor mGroupCursor;//用于填充数据的Cursor对象
public MyExpandableListAdapter(Cursor cursor, Context context,
int groupLayout, int childLayout, String[] groupFrom,
int[] groupTo, String[] childrenFrom, int[] childrenTo) {
// 别忘了调用父类的同等参数的构造函数
// 这里用了八个参数,lastChildLayout没有设置;还有就是groupLayout整合了collapsedGroupLayout和expandedGroupLayout
super(context, cursor, groupLayout, groupFrom, groupTo,
childLayout, childrenFrom, childrenTo);
this.gridLayoutResId = childLayout;
mLayoutInflater = LayoutInflater.from(GridListViewActivity.this);
this.mGroupCursor = cursor;
}
@Override
public int getChildrenCount(int groupPosition) {
//这里返回1是为了让ExpandableListView只显示一个ChildView,否则在展开
//ExpandableListView时会显示和ChildCount数量相同的GridView
return 1;
}
/**
*
* 回调函数,主要实现当选中某个组视图时,要查询指定的子视图所需的信息。<br>
* 注意:<br>
* 别忘了在AdroidManifest.xml中配置读取联系人的权限。<br>
*
*/
@Override
protected Cursor getChildrenCursor(Cursor groupCursor) {
// 获取联系人ID
Long contactId = groupCursor.getLong(mGroupIdColumnIndex);
Log.i("debug_out", "the contact id is " + contactId);
// 构造电话号码URI
Uri.Builder builder = ContactsContract.CommonDataKinds.Phone.CONTENT_URI.buildUpon();
Uri phoneNumbersUri = builder.build();
// 开始查询,Android推荐我们是其自身的managedQuery()方法进行查询,也就是自动管理Cursor。
return managedQuery(
phoneNumbersUri,
mPhoneNumberProjection,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? ",
new String[] { String.valueOf(contactId) }, null);
}
/**
* 实现嵌套GridView的关键所在,这里返回一个包含GridView控件的View并未这个GridView绑定数据*/
@Override
public View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {
ViewHolder mViewHolder;
if (convertView == null) {//利用视图缓存优化数据加载过程
convertView = mLayoutInflater.inflate(this.gridLayoutResId,null);
mViewHolder = new ViewHolder();
mViewHolder.gridView = (GridView) convertView.findViewById(R.id.gridView1);
convertView.setTag(mViewHolder);
} else {
mViewHolder = (ViewHolder) convertView.getTag();
}
this.mGroupCursor.moveToPosition(groupPosition);
Cursor childCursor = getChildrenCursor(this.mGroupCursor);
//给GridView填充数据
GridAdapter gridAdapter = new GridAdapter(
GridListViewActivity.this,
R.layout.grid_item_layout,
childCursor,
new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER },
new int[] { R.id.textView2 });
mViewHolder.gridView.setAdapter(gridAdapter);
mViewHolder.gridView.setOnItemClickListener(this);
return convertView;
}
class ViewHolder {
GridView gridView;
}
public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
Adapter adapter = parent.getAdapter();
Cursor cursor = (Cursor) adapter.getItem(position);
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Log.i("debug_out", "------------>onItemClick the number is " + number);
}
}
private class GridAdapter extends SimpleCursorAdapter {
private LayoutInflater mLayoutInflater;
private Cursor mCursor;
public GridAdapter(Context context, int layout, Cursor c,String[] from, int[] to) {
super(context, layout, c, from, to);
mLayoutInflater = LayoutInflater.from(GridListViewActivity.this);
this.mCursor = c;
}
class ViewHolder2 {
ImageView ig;
TextView tx;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder2 mViewHolder2;
if (convertView == null) {
convertView = mLayoutInflater.inflate(R.layout.grid_item_layout, null);
mViewHolder2 = new ViewHolder2();
mViewHolder2.ig = (ImageView) convertView.findViewById(R.id.imageView2);
mViewHolder2.tx = (TextView) convertView.findViewById(R.id.textView2);
convertView.setTag(mViewHolder2);
} else {
mViewHolder2 = (ViewHolder2) convertView.getTag();
}
this.mCursor.moveToPosition(position);
String number = this.mCursor.getString(mCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Log.i("debug_out", "the number is " + number);
mViewHolder2.tx.setText(number);
return convertView;
}
}
}
分享到:
相关推荐
本文将深入探讨如何在Android中实现`ExpandableListView`嵌套`GridView`。 首先,我们要理解`ExpandableListView`的基本概念。它是一种特殊的`ListView`,具有分组(Group)和子项(Child)的概念。每个分组可以...
在Android开发中,有时我们需要创建复杂布局以满足用户界面的需求,比如在一个ExpandableListView中嵌套GridView。这种设计可以提供层次分明且可扩展的数据展示,让用户能够方便地浏览和操作多级数据。本文将深入...
而在这个特定的案例中,我们将讨论如何将 `GridView` 嵌套在 `ExpandableListView` 的各个分组中,为用户提供更复杂的布局和交互体验。 首先,我们要理解 `ExpandableListView` 的基本工作原理。`...
本篇文章将详细探讨如何在Android中实现ExpandableListView嵌套GridView,以及如何实现多点触控图片缩放的功能。 首先,ExpandableListView是一种可以展开和折叠的列表视图,用于展示层次结构的数据。它允许每个父...
下面将详细介绍如何在`Android`中实现`ExpandableListView`嵌套`GridView`。 ### 1. ExpandableListView基本概念 `ExpandableListView`是Android提供的一个特殊的列表控件,它可以显示分组数据,每个分组下可以...
1、ExpandableListView嵌套GridView 2、group中自定义文字和图片 原文章在 http://blog.csdn.net/u011123829/article/details/9278351
在`ExpandableListView`中嵌套`GridView`的实现过程主要包括以下几个步骤: 1. **创建适配器**:首先,你需要创建一个自定义的`ExpandableListAdapter`,继承自`BaseExpandableListAdapter`。这个适配器将负责填充`...
在这个主题中,我们将深入探讨如何在`ExpandableListView`中嵌套`GridView`,并实现`GridView`中每个item的选中功能。 首先,我们需要创建一个`ExpandableListView`。这个控件可以用来展示分组数据,每组数据可以...
但很多人不需要ExpandableListView 只是单纯的ListView",这表明开发者可能发现了一个常见但并非总是必要的场景,即使用可展开的ListView(ExpandableListView)来嵌套GridView。ExpandableListView允许用户展开或...
本文将详细讲解如何在`ExpandableListView`中嵌套`ListView`和`GridView`。 首先,理解`ExpandableListView`的基本用法。`ExpandableListView`是Android提供的一个可扩展的列表视图,它允许用户点击父项来显示或...
然而,如果在每个组内需要展示多列数据,单纯使用ExpandableListView可能无法满足需求,这时我们可以考虑将GridView嵌套在ExpandableListView的每个子项中,以实现更加复杂和灵活的布局。下面将详细解释如何实现“可...
同样,`GridView`是另一种实现网格布局的控件,但它不支持像`RecyclerView`那样高效地复用视图。 总结来说,`ExpandableListView`、`RecyclerView`和`ListView`都是Android中用于展示列表数据的重要组件,各有其...
6. **使用ExpandableListView**:如果数据结构复杂,可以考虑使用ExpandableListView,它允许展开和折叠组项,这可以减少嵌套的需求。 7. **优化滚动性能**:在处理大量数据时,应优化滚动性能,比如使用ViewHolder...
7. 分组显示:通过嵌套GridView或使用ExpandableListView,实现数据的分组展示。 8. 滑动刷新和加载更多:结合SwipeRefreshLayout,实现上拉刷新和下拉加载更多功能。 9. 横向滚动:通过设置横竖轴的滚动方向,...
1. **嵌套滚动**:当ScrollView嵌套ListView或GridView时,由于两者都有滚动功能,会导致滚动冲突,即一个组件滚动时,另一个组件也可能跟随滚动。 2. **触摸事件处理**:ScrollView会捕获所有的触摸事件,导致...
而在此场景下,我们需要在每个ExpandableListView的子列表项中再嵌套一个ListView,形成双层列表结构,进一步增强数据展示的层次感。 首先,理解expandlist(即ExpandableListView)的工作原理至关重要。...
- 如果好友列表需要按字母分组,可以使用ExpandableListView,或者在ListView上实现类似的功能,通过自定义Adapter和头部视图。 9. **优化性能**: - 使用ListView的setHasStableIds(true)和设置唯一ID,可以帮助...
另外,还可以尝试使用`ExpandableListView`,它在某些场景下可以避免嵌套滚动的问题。 总的来说,处理ScrollView与ListView或GridView的嵌套问题需要深入理解Android的布局系统和测量过程。通过适当的方法调整,...
此外,还有其他一些相关的Android开发知识点,例如如何解决ScrollView嵌套GridView或ExpandableListView时的冲突,如何在ScrollView中嵌套其他可滚动视图(如ViewPager)等。这些都需要开发者深入理解Android的触摸...
"可展开的ListView大集合"是一个专题,涵盖了多种与ListView相关的扩展功能,如GridView和ExpandableListView。这些视图允许用户以网格或层级结构的形式查看数据,提高了用户界面的交互性和用户体验。 1. **...