使用HorizontalListView,實現左右滑動時,有箭頭提示,到達端點時,箭頭消失。
最近做專案,用到水平ListView,對於此,網上已經有很多人寫過了,比較有名的就是HorizontalListView.java。但是如果要實現箭頭的提示(哪邊可滑動,即有箭頭提示往哪邊可滑動)的功能,則無法實現。而且在網上也沒有找到相關的功能,於是,菜鳥嘗試自己動手寫一個,效果如圖,還請大神批評指正。
主要是在HorizontalListView.java中新增一個介面,並實現其呼叫。
介面如下:
一下是在呼叫場景,只要在原有的onLayout方法中進行修改即可。public void setOnHLVStateListener(OnHLVStateListener listener) { hlvStateListener = listener; } public interface OnHLVStateListener { void onScrollMostLeft(); void onScrollMiddle(); void onScrollMostRight(); } @Override public void setOnItemSelectedListener( OnItemSelectedListener listener) { mOnItemSelected = listener; }
@Override protected synchronized void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); if (mAdapter == null) { return; } if (mDataChanged) { int oldCurrentX = mCurrentX; initView(); removeAllViewsInLayout(); mNextX = oldCurrentX; mDataChanged = false; } if (mScroller.computeScrollOffset()) { int scrollx = mScroller.getCurrX(); mNextX = scrollx; } if (mNextX <= 0) { mNextX = 0; hlvStateListener.onScrollMostLeft(); mScroller.forceFinished(true); }else if (mNextX >= mMaxX) { mNextX = mMaxX; hlvStateListener.onScrollMostRight(); mScroller.forceFinished(true); }else { hlvStateListener.onScrollMiddle(); } int dx = mCurrentX - mNextX; removeNonVisibleItems(dx); fillList(dx); positionItems(dx); mCurrentX = mNextX; if (!mScroller.isFinished()) { post(new Runnable() { @Override public void run() { requestLayout(); } }); } }
然後在MainActivity中監聽就行
package com.content.henry.horizonarrowdemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ImageView; public class MainActivity extends AppCompatActivity { HorizontalListView hl; ImageView left, right; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String[] title = new String[]{"美食", "酒店", "交通", "娛樂", "購物", "遊玩", "更多"}; int[] icons = new int[]{R.mipmap.food, R.mipmap.food, R.mipmap.food, R.mipmap.food, R.mipmap.food, R.mipmap.food, R.mipmap.food}; hl = (HorizontalListView) findViewById(R.id.hlview); left = (ImageView) findViewById(R.id.left); right = (ImageView) findViewById(R.id.right); HorizontalListViewAdapter adapter = new HorizontalListViewAdapter(this, title, icons); hl.setAdapter(adapter); hl.setOnHLVStateListener(new HorizontalListView.OnHLVStateListener() { @Override public void onScrollMostRight() { left.setVisibility(View.VISIBLE); right.setVisibility(View.GONE); } @Override public void onScrollMostLeft() { left.setVisibility(View.GONE); right.setVisibility(View.VISIBLE); } @Override public void onScrollMiddle() { left.setVisibility(View.VISIBLE); right.setVisibility(View.VISIBLE); } }); } }
當然adapter和相應的佈局檔案還是要有的,沒有啥特殊的,直接上程式碼
package com.content.henry.horizonarrowdemo;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class HorizontalListViewAdapter extends BaseAdapter {
private int[] mIconIDs;
private String[] mTitles;
private MainActivity mContext;
private LayoutInflater mInflater;
Bitmap iconBitmap;
private int selectIndex = -1;
public HorizontalListViewAdapter(MainActivity context, String[] titles, int[] ids) {
this.mContext = context;
this.mIconIDs = ids;
this.mTitles = titles;
mInflater =
(LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);// LayoutInflater.from(mContext);
}
@Override
public int getCount() {
return mIconIDs.length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@SuppressLint("InflateParams")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView =
mInflater
.inflate(R.layout.item,
null);
holder.mImage =
(ImageView) convertView.findViewById(R.id.item_yszxygy_iv);
holder.mTitle =
(TextView) convertView.findViewById(R.id.item_yszxygy_tv);
holder.ll_item =
(LinearLayout) convertView.findViewById(R.id.item_yszxygy);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (position == selectIndex) {
convertView.setSelected(true);
} else {
convertView.setSelected(false);
}
holder.mTitle.setText(mTitles[position]);
holder.mImage.setImageResource(mIconIDs[position]);
WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
@SuppressWarnings("deprecation")
int widthS = wm.getDefaultDisplay().getWidth();//��Ļ���
@SuppressWarnings("deprecation")
int heightS = wm.getDefaultDisplay().getHeight();
int width =
widthS / 4;
int height = heightS * 1 / 5;
LayoutParams para;
para = holder.ll_item.getLayoutParams();
// 設定
para.width = width;
para.height = height;
holder.ll_item.setLayoutParams(para);
return convertView;
}
private static class ViewHolder {
/**
* 標題
*/
private TextView mTitle;
/**
* 圖片
*/
private ImageView mImage;
/**
* 佈局
*/
private LinearLayout ll_item;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/item_yszxygy"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:orientation="vertical">
<View
android:id="@+id/item_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="30" />
<ImageView
android:id="@+id/item_yszxygy_iv"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center_horizontal"
android:layout_weight="46"
android:scaleType="center" />
<TextView
android:id="@+id/item_yszxygy_tv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="68"
android:gravity="center_vertical|center_horizontal"
android:textColor="#000000"
android:textSize="20sp" />
</LinearLayout>
</LinearLayout>
寫的不是很詳細,下面我會附上程式碼地址,請大神指正。
demo地址:http://download.csdn.net/detail/henry__mark/9573358;
相關推薦
使用HorizontalListView,實現左右滑動時,有箭頭提示,到達端點時,箭頭消失。
最近做專案,用到水平ListView,對於此,網上已經有很多人寫過了,比較有名的就是HorizontalListView.java。但是如果要實現箭頭的提示(哪邊可滑動,即有箭頭提示往哪邊可滑動)的功能,則無法實現。而且在網上也沒有找到相關的功能,於是,菜鳥嘗試自己動手寫一
單行文字,在內容較多的時候,實現左右滑動的方案
問題描述: 在專案中,有時會遇到一個固定行數的文字顯示控制元件。有時我們採用textview來顯示,利用走馬燈來省略過多的內容。但是有時需要單行顯示,多出的內容滑動來檢視。 解決方案: 網上看了很多要自定
阻止touchslider事件冒泡,防止左右滑動時出發全局滑動事件
出發 ron 分支 hsl == mov typeof interval stop 最近適用mui開發一個項目,全局有個側滑菜單offCanvasSideScroll,首頁用了一個touchslider插件來實現行的左右滾動 touchslider的當滾動方向與側滑菜單滾動
js實現左右滑動的導航選單,仿今日頭條頂部選單
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <t
C語言之定義一個函式,實現對字串做如下操作:當字元為字母時,大小寫互換,當字元為數字時,原樣輸出,當有其它字元出現時,結束操作,返回已處理的字串
Action(){ char str[]={"tEst234%^road"};int len = sizeof(str)/sizeof(char);//strTest2呼叫函式lr_output_message("%s",strTest2(str,len)); r
(轉)linux sudo 重定向,實現只有系統管理員才有權限操作的文件中寫入信息
shel echo 命令 文件 sudo 命令 方式 符號 iss 字串 chown 眾所周知,使用 echo 並配合命令重定向是實現向文件中寫入信息的快捷方式。 本文介紹如何將 echo 命令與 sudo 命令配合使用,實現向那些只有系統管理員才有權限操作的文件中寫入信
小程序選項卡,可左右滑動
size var 內容 右滑 tom return else tail tro wxhtml: <view class="swiper-tab"> <view class="tab-item swiper-tab-item {{currentTab=
【12】MUI 仿拼多多 全部訂單(頂部選單欄,可左右滑動,webview模式)
點選此處:MUI仿拼多多總目錄 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-
原生js實現淘寶輪播圖,支援左右和跳轉(滑鼠點多快都不會亂)。
用transform是因為這個比left的效能好。 這個是演示網址(不要直接存下來哦):https://shalltears.github.io/test-sowing-map/ 。 這個是完整程式碼下載地址,覺得還行的下載支援一下:https://download.csdn.ne
android GridView 只顯示一行,可以左右滑動
/** * * @param context * @param WidthdpValue * @param HeightdpValue * @param mList * @param mGridView * @param ImgType */ public sta
搭建FTP服務,實現三種方式的訪問:1.匿名訪問;2,本地用戶訪問;3虛擬用戶訪問。
行程 工作環境 能夠 ftp用戶 a10 linu 進入 編輯 binary FTP服務(File Transfer Protocol,文件傳輸協議)是典型的C/S結構 的應用層協議,需要由服務端軟件,客戶端軟件兩部分共同實 現文件
Android Fragment+Viewpager實現左右滑動和點選 實現DrawerLayout
xml佈局程式碼: <android.support.v4.widget.DrawerLayout xmlns:android=“http://schemas.android.com/apk/res/android” xmlns:app=“http://schemas.androi
仿淘寶、京東、美團使用ViewPager+GridView實現左右滑動檢視更多分類導航功能
文章說明 本文修改自開發者原始碼 微信公共號:China-dvlp 如果你有想學習的文章直接關注公眾號(開發者原始碼)回覆,我會整理徵稿。如果你有好的文章想和大家分享歡迎投稿,直接向我回覆文章連結即可。 概 述 仿淘寶、京東、美團使用ViewPage
Tablayout+Viewpager+Frgment 做Viewapger的快取,並且第一次點選tab都去重新整理,但是第二次之後都有快取且不會自動重新整理可以主動重新整理。Fragment的重新整理
Tablayout+Viewpager+Frgment 做Viewapger的快取,並且第一次點選tab都去重新整理,但是第二次之後都有快取且不會自動重新整理可以主動重新整理。 需要實現這個首先你需要了解fragment的一個方法 @Override public voi
Android中Fragment+Viewpager實現左右滑動和點選
一.佈局檔案 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.view.ViewPager android:id="@+id/viewpager" andr
frp多客戶端,實現一臺雲伺服器連線多個區域網內的主機,多埠轉發
很簡單,用不同的frps.ini就行 假設你原來已經啟動了一個frps.ini,現在想再加一個。 那就新建一個frps1.ini,然後埠和之前的不一樣就行。 假設之前有一個7000的埠了,那現在這個用7001就可以啦~ cp frps.ini frps1.ini 如
純JS實現左右滑動佈局和滑動
<!DOCTYPE html> <html> <head> <meta charset=utf-8> <meta name=keywords content=首頁> <meta name
android 使用ViewFlow實現左右滑動
是的,你沒看錯,是ViewFlow,不是ViewPager,也不是ViewFlipper。ViewFlow是一個開源的androidUI庫。它提供了三個元件ViewFlow、FlowIndicator和TitleFlowIndicator。它使得由Adapter產生的ViewGroup中的View可以水
iOS使用UIScrollView實現左右滑動UITableView和UICollectionView
在UIScrollView中巢狀UITableView的文章很多,但是專案需要,需要巢狀UICollectionView,而UICollectionView和UITableView有很多不同,有些知識到現在也沒搞清楚,一遍一遍的嘗試,總算是做出來了。以下是實現後的效果圖:
html實現左右滑動選單
ps:最近在寫一個公眾號專案時遇到需要動態生成選單可滑動,在之前的android開發中實現通過v7包中提供的元件即可完成。那麼,在網頁的開發中需要如何實現這個功能呢?!,這裡通過swiper.js來實現可滑動選單。 http://www.swiper.com.