1. 程式人生 > >使用HorizontalListView,實現左右滑動時,有箭頭提示,到達端點時,箭頭消失。

使用HorizontalListView,實現左右滑動時,有箭頭提示,到達端點時,箭頭消失。

最近做專案,用到水平ListView,對於此,網上已經有很多人寫過了,比較有名的就是HorizontalListView.java。但是如果要實現箭頭的提示(哪邊可滑動,即有箭頭提示往哪邊可滑動)的功能,則無法實現。而且在網上也沒有找到相關的功能,於是,菜鳥嘗試自己動手寫一個,效果如圖,還請大神批評指正。


主要是在HorizontalListView.java中新增一個介面,並實現其呼叫。

介面如下:

    
    public void setOnHLVStateListener(OnHLVStateListener listener) {
        hlvStateListener = listener;
    }

    public interface OnHLVStateListener {
        void onScrollMostLeft();

        void onScrollMiddle();

        void onScrollMostRight();

    }

    @Override
    public void setOnItemSelectedListener(
            OnItemSelectedListener listener) {

        mOnItemSelected = listener;
    }
一下是在呼叫場景,只要在原有的onLayout方法中進行修改即可。
  @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.