android中带字母索引器和字母分组的Gridview

android中带字母索引器和字母分组的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

IndexableGridView.java

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对象。它要求我使用游标..而我在这里没有使用任何游标。