1.android 使用GridView 实现加载大量的数据显示。未显示出来的数据可以滑动屏幕让底部的数据显示出来,但是原生态的GridView 并没有很美观平滑的一个动画来滚动数据,因此,我们可以稍做修改就可以实现 类似VST全聚合里面 视频加载也那样的翻页动画效果了。
2.自定义GridView控件代码如下:
/*
* @Title: SmoothGridView.java
* @Copyright: Corporation. Ltd. Copyright 1998-2018, All rights reserved
* @Description: TODO<请描述此文件是做什么的>
* @author: xjp
* @data: 2014年8月20日 上午9:50:57
* @version: V1.0
*/
package com.mktech.localapp;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
/**
* TODO<请描述这个类是干什么的>
*
* @author xjp
* @data: 2014年8月20日 上午9:50:57
* @version: V1.0
*/
public class SmoothGridView extends GridView {
private boolean isScroll = false;
private int position = 0;
// private int iCount;
private int iColumns;
private int iFirstView;
private int iLastView;
private int iselecte;
private boolean isFirst = true;
static int iPageNum = 0;
public SmoothGridView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@SuppressLint("NewApi")
public SmoothGridView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public SmoothGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
// public void setScrollToScrenPosition(int position, boolean isScroll) {
// this.position = position;
// this.isScroll = isScroll;
// }
@SuppressLint("NewApi")
@Override
protected void layoutChildren() {
// TODO Auto-generated method stub
super.layoutChildren();
if (isFirst) {
iFirstView = getFirstVisiblePosition();
iLastView = getLastVisiblePosition();
iPageNum = iLastView - iFirstView + 1;
iColumns = getNumColumns();
Log.e(VIEW_LOG_TAG, "iPageNum---->>>" + iPageNum);
isFirst = false;
}
// iCount = getCount();
iselecte = getSelectedItemPosition();
Log.e(VIEW_LOG_TAG, "iFirstView----->>>" + iFirstView
+ "iLastView--->>>" + iLastView + "iselecte-->>>" + iselecte);
this.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN
&& event.getAction() == KeyEvent.ACTION_DOWN) {
Log.e(VIEW_LOG_TAG, "iColumns---->>>" + iColumns);
if (iselecte % iPageNum >= iPageNum - iColumns
&& iselecte % iPageNum < iPageNum) {
Log.e(VIEW_LOG_TAG, "iselecte---->>>" + iselecte);
position = iselecte + iColumns;
isScroll = true;
}
}
if (keyCode == KeyEvent.KEYCODE_DPAD_UP
&& event.getAction() == KeyEvent.ACTION_DOWN) {
if (iselecte % iPageNum >= 0
&& iselecte % iPageNum < iColumns) {
Log.e(VIEW_LOG_TAG, "iselecte---->>>" + iselecte);
isScroll = true;
position = ((iselecte - iPageNum) / iColumns)
* iColumns;
}
}
return false;
}
});
if (!isScroll) {
return;
}
isScroll = false;
Log.e(VIEW_LOG_TAG, "position---->>>" + position);
smoothScrollToPositionFromTop(position, 20, 500);
}
}
其中关键的地方是使用到了 smoothScrollToPositionFromTop(position, offset, duration); 接口函数。
public void smoothScrollToPositionFromTop (int position, int offset,int duration)
平滑滚动到指定的适配器位置。 指定位置的视图会滚动到相对顶边偏移 offset 像素的位置显示。 如果无法做到(比如该偏移量会使首尾条目超越列表边缘),会滚动到尽量接近的位置。
参数
position 滚动到的位置
offset 滚动结束时,指定 position 条目距离视图顶部的像素数
duration 滚动执行的毫秒数
3.怎么使用? 像使用自定义控件一样使用。
完整工程代码: