android中带字母索引器和字母分组的Gridview
IndexableGridView.javaandroid中带字母索引器和字母分组的Gridview,android,android-gridview,Android,Android Gridview,IndexableGridView.java public class IndexableGridView extends GridView { private boolean mIsFastScrollEnabled = false; private IndexGridScroller mScroller = null; private GestureDetector mGestureDetector = null; public IndexableGridView(Context con
public class IndexableGridView extends GridView {
private boolean mIsFastScrollEnabled = false;
private IndexGridScroller mScroller = null;
private GestureDetector mGestureDetector = null;
public IndexableGridView(Context context) {
super(context);
}
public IndexableGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public IndexableGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean isFastScrollEnabled() {
return mIsFastScrollEnabled;
}
@Override
public void setFastScrollEnabled(boolean enabled) {
mIsFastScrollEnabled = enabled;
if (mIsFastScrollEnabled) {
if (mScroller == null)
mScroller = new IndexGridScroller(getContext(), this);
} else {
if (mScroller != null) {
mScroller.hide();
mScroller = null;
}
}
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
// Overlay index bar
if (mScroller != null)
mScroller.draw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
// Intercept ListView's touch event
if (mScroller != null && mScroller.onTouchEvent(ev))
return true;
if (mGestureDetector == null) {
mGestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
// If fling happens, index bar shows
if (mScroller != null)
mScroller.show();
return super.onFling(e1, e2, velocityX, velocityY);
}
});
}
mGestureDetector.onTouchEvent(ev);
return super.onTouchEvent(ev);
}
@Override
public void setAdapter(ListAdapter adapter) {
super.setAdapter(adapter);
if (mScroller != null)
mScroller.setAdapter(adapter);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (mScroller != null)
mScroller.onSizeChanged(w, h, oldw, oldh);
}
}
ImageAdapter.java
public class ImageAdapter extends BaseAdapter implements SectionIndexer{
private String mSections = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private Context mContext;
List<String> mItems;
// Constructor
public ImageAdapter(Context c, List<String> mItems) {
mContext = c;
this.mItems = mItems;
}
public int getCount() {
return mItems.size();
}
public Object getItem(int position) {
return mItems.get(position);
}
public long getItemId(int position) {
return mItems.indexOf(getItem(position));
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageBitmap(getBitmapFromAsset("imgs", mItems.get(position)));
return imageView;
}
@Override
public Object[] getSections() {
// TODO Auto-generated method stub
String[] sections = new String[mSections.length()];
for (int i = 0; i < mSections.length(); i++)
sections[i] = String.valueOf(mSections.charAt(i));
return sections;
}
@Override
public int getPositionForSection(int sectionIndex) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int getSectionForPosition(int position) {
// TODO Auto-generated method stub
for (int i = position; i >= 0; i--) {
for (int j = 0; j < getCount(); j++) {
if (i == 0) {
// For numeric section
for (int k = 0; k <= 9; k++) {
if (StringMatcher.match(String.valueOf(((String) getItem(j)).charAt(0)), String.valueOf(k)))
return j;
}
} else {
if (StringMatcher.match(String.valueOf(((String) getItem(j)).charAt(0)), String.valueOf(mSections.charAt(i))))
return j;
}
}
}
return 0;
}
}
private Bitmap getBitmapFromAsset(String folder, String strName)
{
AssetManager assetManager = getResources().getAssets();
InputStream istr = null;
Bitmap bitmap = null;
try {
istr = assetManager.open(folder+"/"+strName);
bitmap = BitmapFactory.decodeStream(istr);
istr.close();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
公共类ImageAdapter扩展BaseAdapter实现SectionIndexer{
私有字符串mSections=“#abcdefghijklmnopqrstuvxyz”;
私有上下文;
列出螨类;
//建造师
公共ImageAdapter(上下文c,列表M){
mContext=c;
this.mItems=mItems;
}
public int getCount(){
返回mItems.size();
}
公共对象getItem(int位置){
返回mItems.get(位置);
}
公共长getItemId(int位置){
返回mItems.indexOf(getItem(position));
}
//为适配器引用的每个项目创建新的ImageView
公共视图getView(int位置、视图转换视图、视图组父视图){
图像视图图像视图;
if(convertView==null){
imageView=新的imageView(mContext);
setLayoutParams(新的GridView.LayoutParams(85,85));
imageView.setScaleType(imageView.ScaleType.CENTER\U裁剪);
设置填充(8,8,8,8);
}否则{
imageView=(imageView)convertView;
}
setImageBitmap(getBitmapFromAsset(“imgs”,mItems.get(position));
返回图像视图;
}
@凌驾
公共对象[]getSections(){
//TODO自动生成的方法存根
String[]sections=新字符串[mSections.length()];
对于(int i=0;i=0;i--){
对于(int j=0;j 对于(int k=0;k用于对网格进行排序:
使用名称字符串创建一个pojo
类。然后将该pojo
传递给比较器
。比较名称1和名称2,并返回前面的名称
用于分组:
基本上,您需要一个用于分组的标题。使用这个(Stickygridheaders)进行分组。您是否调用了setFastScrollEnabled(true)
在您的IndexableGridView
?@MikeM.是的,我试过了,但我也想按字母顺序分组显示数据。@MikeM.我为此添加了图像。为此,创建一个名为string的pojo类。然后将该pojo传递给比较器
。将名称1与2进行比较,并返回前面的名称。@PsyDuck我想创建groupwise gridview..正如您在图中所看到的。它真的很有效..非常感谢..现在我想要右边的字母索引器。检查一下这个。它使用游标和SimpleCursorAdapter..而我使用的是baseadapter。当您使用gridview实现字母索引器时,到底发生了什么?列表显示了吗?给我看一下它的屏幕截图也不是,但我的问题是在AlphacalIndexer对象。它要求我使用游标..而我在这里没有使用任何游标。