当前位置:操作系统 > 安卓/Android >>

Android中如何实现多行、水平滚动的分页的Gridview?

功能要求:

(1)比如每页显示2X2,总共2XN,每个item显示图片+文字(点击有链接)。

如果单行水平滚动,可以用Horizontalscrollview实现。

如果是多行水平滚动,则结合Gridview(一般是垂直滚动的)和Horizontalscrollview实现。

(2)水平滚动翻页,下面有显示当前页的icon。

 

 

1.      实现自定义的HorizontalScrollView(HorizontalScrollView.java):

因为要翻页时需要传当前页给调用者,所以fling函数中自己实现而不要调用父类的fling。


[java]  public class DrawerHScrollView extends HorizontalScrollView { 
    private static final String TAG = "DrawerHScrollView"; 
     
    private IDrawerPresenter drawerPresenter = null; 
    private int currentPage = 0; 
    private int totalPages = 1; 
    private static Hashtable<Integer, Integer> positionLeftTopOfPages = new Hashtable(); 
 
    public DrawerHScrollView(Context context) { 
        super(context); 
    } 
 
    public DrawerHScrollView(Context context, AttributeSet attrs) { 
        super(context, attrs); 
    } 
 
    public DrawerHScrollView(Context context, AttributeSet attrs, int defStyle) { 
        super(context, attrs, defStyle); 
    } 
     
    public void cleanup(){ 
        currentPage = 0; 
        totalPages = 1; 
        drawerPresenter = null; 
        if(positionLeftTopOfPages != null){ 
            positionLeftTopOfPages.clear(); 
        } 
    } 
     
    public void setParameters(int totalPages, int currentPage, int scrollDisX) { 
        Log.d(TAG, "~~~~~setParameters totalPages:"+totalPages +",currentPage:"+ currentPage +",scrollDisX:"+scrollDisX); 
        this.totalPages = totalPages; 
        this.currentPage = currentPage; 
        positionLeftTopOfPages.clear(); 
        for (int i = 0;i<totalPages;i++){ 
            int posx = (scrollDisX) * i; 
            positionLeftTopOfPages.put(i, posx); 
            Log.d(TAG, "~~~~~setParameters i:"+i +",posx:"+posx); 
        } 
        smoothScrollTo(0, 0); 
    } 
     
    public void setPresenter(IDrawerPresenter drawerPresenter ) { 
        this.drawerPresenter = drawerPresenter; 
    } 
     
    @Override 
    public void fling(int velocityX) { 
        Log.v(TAG, "-->fling velocityX:"+velocityX); 
        boolean change_flag = false; 
        if (velocityX > 0 && (currentPage < totalPages - 1)){ 
            currentPage++; 
            change_flag = true; 
        } else if (velocityX < 0 && (currentPage > 0)){ 
            currentPage--; 
            change_flag = true; 
        } 
        if (change_flag){ 
            int postionTo = (Integer)positionLeftTopOfPages.get(new Integer(currentPage)).intValue(); 
            Log.v(TAG, "------smoothScrollTo posx:"+postionTo); 
            smoothScrollTo(postionTo, 0); 
            drawerPresenter.dispatchEvent(totalPages, currentPage); 
        } 
        //super.fling(velocityX);  
    } 

public class DrawerHScrollView extends HorizontalScrollView {
 private static final String TAG = "DrawerHScrollView";
 
 private IDrawerPresenter drawerPresenter = null;
 private int currentPage = 0;
 private int totalPages = 1;
 private static Hashtable<Integer, Integer> positionLeftTopOfPages = new Hashtable();

 public DrawerHScrollView(Context context) {
  super(context);
 }

 public DrawerHScrollView(Context context, AttributeSet attrs) {
  super(context, attrs);
 }

 public DrawerHScrollView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
 }
 
 public void cleanup(){
  currentPage = 0;
  totalPages = 1;
  drawerPresenter = null;
  if(positionLeftTopOfPages != null){
   positionLeftTopOfPages.clear();
  }
 }
 
 public void setParameters(int totalPages, int currentPage, int scrollDisX) {
  Log.d(TAG, "~~~~~setParameters totalPages:"+totalPages +",currentPage:"+ currentPage +",scrollDisX:"+scrollDisX);
  this.totalPages = totalPages;
  this.currentPage = currentPage;
  positionLeftTopOfPages.clear();
  for (int i = 0;i<totalPages;i++){
   int posx = (scrollDisX) * i;
   positionLeftTopOfPages.put(i, posx);
   Log.d(TAG, "~~~~~setParameters i:"+i +",posx:"+posx);
  }
  smoothScrollTo(0, 0);
 }
 
 public void setPresenter(IDrawerPresenter drawerPresenter ) {
  this.drawerPresenter = drawerPresenter;
 }
 
 @Override
 public void fling(int velocityX) {
  Log.v(TAG, "-->fling velocityX:"+velocityX);
  boolean change_flag = false;
  if (velocityX > 0 && (currentPage < totalPages - 1)){
   currentPage++;补充:移动开发 , Android ,

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,