亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android中實現多行、水平滾動的分頁的Gridview實例源碼

2020-04-11 12:13:36
字體:
來源:轉載
供稿:網友
功能要求:
(1)比如每頁顯示2X2,總共2XN,每個item顯示圖片+文字(點擊有鏈接)。
如果單行水平滾動,可以用Horizontalscrollview實現。
如果是多行水平滾動,則結合Gridview(一般是垂直滾動的)和Horizontalscrollview實現。
(2)水平滾動翻頁,下面有顯示當前頁的icon。

1.實現自定義的HorizontalScrollView(HorizontalScrollView.java):
因為要翻頁時需要傳當前頁給調用者,所以fling函數中自己實現而不要調用父類的fling。
復制代碼 代碼如下:

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);
}
}

2.布局文件Activity_main.xml:
復制代碼 代碼如下:

<com.example.multilinegridview.DrawerHScrollView
android:id="@+id/hscrollview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:scrollbars="none"
android:layout_below="@id/layout_drawer_top"
android:layout_above="@id/layout_pagenumber"
android:background="#CCCCCC" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<GridView
android:id="@+id/gridView"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</com.example.multilinegridview.DrawerHScrollView>

3.IDrawerPresenter接口(IDrawerPresenter.java):
復制代碼 代碼如下:

public interface IDrawerPresenter {
IDrawerPresenter getInstance();
void dispatchEvent(int totalPages, int currentPage);
}

4.DrawerItem
復制代碼 代碼如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_item"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="center"
android:background="#FFFFFF">
<ImageView
android:id="@+id/ivIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="優惠券1"
android:textColor="#000000"
android:textStyle="bold"/>
</LinearLayout>

5.MainActivity.java
(1)實現IDrawerPresenter接口,在HorizontalScrollView里通過IDrawerPresenter接口來返回當前頁,從而更新pageindicator。
復制代碼 代碼如下:

@Override
public IDrawerPresenter getInstance() {
return this;
}
@Override
public void dispatchEvent(int totalPages, int currentPage) {
Log.v(TAG, "~~~~dispatchEvent currentPage:" + currentPage);
Message msg = Message.obtain();
msg.what = MSG_DRAWER_UPDATE_PAGE_LAYOUT;
msg.arg1 = totalPages;
msg.arg2 = currentPage;
handler.sendMessage(msg);
}

(2)PageItemImageView和page indicator的更新
PageItemImageView顯示normal的page indicator,之后再將當前頁的圖片換成selected。
復制代碼 代碼如下:

protected class PageItemImageView extends ImageView {
public PageItemImageView(Context context) {
super(context);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.icon_page_normal);
this.setImageBitmap(bitmap);
}
}
public void updateDrawerPageLayout(int total_pages, int sel_page) {
Log.e(TAG, "~~~updateBooksPageLayout total_pages:"+total_pages+",sel_page:"+sel_page);
layout_pagenumber.removeAllViews();
if (total_pages <= 0 || sel_page < 0 || sel_page >= total_pages){
Log.e(TAG, "total_pages or sel_page is outofrange.");
return;
}
for (int i = 0;i< total_pages;i++){
if (i != 0){
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.setMargins(5, 0, 0, 0);
layout_pagenumber.addView(new PageItemImageView(this), params);
} else {
layout_pagenumber.addView(new PageItemImageView(this));
}
}
PageItemImageView selItem = (PageItemImageView) layout_pagenumber.getChildAt(sel_page);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon_page_selected);
selItem.setImageBitmap(bitmap);
}

(3)DrawerListAdapter
復制代碼 代碼如下:

private class DrawerListAdapter extends BaseAdapter {
private final String TAG = "MyListAdapter";
private LayoutInflater mInflater;
private LinearLayout layout_item;
private TextView tvTitle;
private ImageView ivIcon;
private final Context context;
private int colWid;
private int colHei;
public DrawerListAdapter(Context context, int colWid, int colHei) {
this.context = context;
this.colWid = colWid;
this.colHei = colHei;
mInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
return drawerItemList.size();
}
public Object getItem(int position) {
return drawerItemList.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
DrawerItem item = drawerItemList.get(position);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.drawer_item, null);
layout_item = (LinearLayout) convertView
.findViewById(R.id.layout_item);
ivIcon = (ImageView) convertView.findViewById(R.id.ivIcon);
tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);
if (colHei != 0 && colWid != 0) {
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
colWid, colHei - 30);
ivIcon.setLayoutParams(params);
}
convertView.setTag(layout_item);
} else {
layout_item = (LinearLayout) convertView.getTag();
}
ivIcon.setImageResource(R.drawable.ic_launcher);
tvTitle.setText(String.valueOf(position));
return convertView;
}
}

(4)DrawerItemClickListener:
實現OnItemClickListener。
(5) updateDrawerLayout
獲得data的size后,可以算出列數來得到固定行。
intnumCols = (drawerItemList.size() - 1) / 2 + 1
再算出gridview的width。因每頁可顯示2列,最后一頁可能右側沒有,為了翻頁順滑,可以給gridview增加一列空白。
intgridViewWid = numCols * colWid + (numCols + 1) * spaceing;
if(numCols % 2 == 1){
gridViewWid+= colWid + spaceing;
}
復制代碼 代碼如下:

public void updateDrawerLayout() {
if ((drawerItemList == null) || (drawerItemList.size() == 0)) {
Log.d(TAG, "itemList is null or empty");
return;
}
if (!hasMeasured){
Log.d(TAG, "hasMeasured is false");
return;
}
int scrollWid = hscrollview.getWidth();
int scrollHei = hscrollview.getHeight();
if (scrollWid <= 0 || scrollHei <= 0){
Log.d(TAG, "scrollWid or scrollHei is less than 0");
return;
}

int spaceing = 10;
int colWid = (scrollWid - spaceing * 3) / 2;
int colHei = (scrollHei - spaceing * 3) / 2;
int numCols = (drawerItemList.size() - 1) / 2 + 1;
int gridViewWid = numCols * colWid + (numCols + 1) * spaceing;
// if numCols is odd (like 5), add blank space
if (numCols % 2 == 1){
gridViewWid += colWid + spaceing;
}

LayoutParams params = new LayoutParams(gridViewWid, scrollHei);
gridView.setLayoutParams(params);
gridView.setColumnWidth(colWid);
gridView.setHorizontalSpacing(spaceing);
gridView.setVerticalSpacing(spaceing);
gridView.setStretchMode(GridView.NO_STRETCH);
gridView.setNumColumns(numCols);
adapter = new DrawerListAdapter(this, colWid, colHei);
listener = new DrawerItemClickListener();
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(listener);
int pageNum = (drawerItemList.size() - 1) / 4 + 1;
hscrollview.setParameters(pageNum, 0, scrollWid - spaceing);
updateDrawerPageLayout(pageNum, 0);
}

效果圖:
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人h版在线观看| 久久97精品久久久久久久不卡| 91精品久久久久久久久久久久久| 国产欧美日韩高清| 亚洲成人三级在线| 欧美贵妇videos办公室| 国产偷国产偷亚洲清高网站| 国产精品99一区| 国产精品一区二区久久国产| 影音先锋欧美在线资源| 久久久久久久久爱| 亚洲一区二区久久久久久久| 欧美激情精品久久久久久黑人| 热久久视久久精品18亚洲精品| 日韩av在线网站| 国产精品日韩欧美大师| 88xx成人精品| 亚洲国产精品yw在线观看| 91成人在线视频| 日韩av一区在线观看| 亚洲精品在线看| 欧美成人精品一区二区三区| 亚洲精品午夜精品| 日韩国产在线播放| 一本久久综合亚洲鲁鲁| 一本色道久久综合亚洲精品小说| 欧美成人在线影院| 亚洲另类激情图| 日韩欧美在线视频免费观看| 欧美国产日本在线| 午夜精品久久久久久久99热| 国产精品视频公开费视频| 91视频国产精品| 国产精品极品在线| 日韩电影免费观看在线| 国产91精品在线播放| 久久久精品网站| 中文字幕日韩av综合精品| 久久久久久亚洲| 亚洲一区二区久久久久久久| 岛国av一区二区在线在线观看| 亚洲国语精品自产拍在线观看| 午夜精品美女自拍福到在线| 亚洲美女性生活视频| 高跟丝袜一区二区三区| 国产精品免费一区豆花| 欧美激情成人在线视频| 91亚洲va在线va天堂va国| 国产精品揄拍500视频| 亚洲色图狂野欧美| 久久久国产一区二区三区| 午夜精品美女自拍福到在线| 国模视频一区二区| 国产精品夫妻激情| 国产一区二区香蕉| 日韩精品极品视频免费观看| 国产91免费看片| 国模精品视频一区二区| 久久精品国产欧美亚洲人人爽| 国产精品视频999| 精品久久久一区二区| 久久伊人精品一区二区三区| 亚洲乱码国产乱码精品精| 狠狠色狠狠色综合日日五| 91在线免费看网站| 亚洲精品电影在线观看| 久久久久久久久爱| 欧美性色19p| 日韩有码片在线观看| 国产日韩欧美黄色| www.日韩不卡电影av| 亚洲永久免费观看| 欧美大尺度在线观看| 日韩久久精品电影| 中文字幕欧美在线| 日日噜噜噜夜夜爽亚洲精品| 亚洲男人的天堂在线| 亚洲激情第一页| 色婷婷久久av| 日本成人精品在线| 国产成人福利夜色影视| 在线a欧美视频| 国产午夜精品视频免费不卡69堂| 中文字幕自拍vr一区二区三区| 姬川优奈aav一区二区| 欧美精品在线免费播放| 亚洲一区www| 5566成人精品视频免费| 色偷偷av一区二区三区乱| 91精品视频播放| 亚洲伊人久久综合| 国产一区二区欧美日韩| 91在线观看免费网站| 久久99久久久久久久噜噜| 亚洲美女在线视频| 国产欧美亚洲精品| 麻豆精品精华液| 成人情趣片在线观看免费| 日韩av最新在线观看| 日韩欧美亚洲综合| 欧美有码在线视频| 中文日韩在线观看| 国产脚交av在线一区二区| 91精品国产高清久久久久久久久| 亚洲小视频在线观看| 亚洲最大中文字幕| 91精品国产自产在线观看永久| 黑人巨大精品欧美一区二区一视频| 久久99热这里只有精品国产| 91免费精品国偷自产在线| 在线视频一区二区| 一区二区亚洲欧洲国产日韩| 91色琪琪电影亚洲精品久久| 欧美老少做受xxxx高潮| 日韩av在线看| 亚洲最大福利网| 亚洲精品欧美极品| 91在线色戒在线| 亚洲四色影视在线观看| 国产精品va在线播放我和闺蜜| 欧美限制级电影在线观看| 中文字幕日韩av电影| 国产精品福利在线观看| 日韩69视频在线观看| 这里精品视频免费| 97精品一区二区视频在线观看| 久久免费视频在线| 久久精品国产一区二区三区| 自拍偷拍亚洲精品| 国产成人av网| 97av视频在线| 亚洲精品日韩久久久| 日本欧美在线视频| 欧美在线视频免费观看| 91网站在线免费观看| 中文字幕久热精品视频在线| 亚洲国语精品自产拍在线观看| 欧美怡红院视频一区二区三区| 亚洲视频网站在线观看| 综合网日日天干夜夜久久| 久久久中文字幕| 日韩av在线免费观看| 亚洲欧美在线一区| 在线色欧美三级视频| 欧美性生交xxxxx久久久| 亚洲免费影视第一页| 欧美黑人一区二区三区| 日韩在线视频线视频免费网站| 国产精品久久中文| 亚洲精品视频免费| 欧美一级电影免费在线观看| 97视频在线观看免费| 亚洲第一网中文字幕| 亚洲最大在线视频| 中文.日本.精品| 国产一区二区三区中文| 久久久久免费视频| 97在线看免费观看视频在线观看| 国产精品久久久久久久久影视| 亚洲欧美中文日韩在线v日本| 在线播放精品一区二区三区| 国产一区二区久久精品| 欧美中文字幕在线视频| 久久亚洲精品一区二区|