国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android仿制淘寶滾動圖文條的示例代碼

2019-10-21 21:40:59
字體:
來源:轉載
供稿:網友

開篇廢話

產品讓我們將“我的”頁面改版,上面加了一個廣告條,非常類似淘寶“我的”頁面的廣告條,然后就自己寫了一個,方法比較一般,如果大家有更好的辦法請留言給我,謝謝。 滾動圖文條之GitHub地址 ,幫我點個Star。

滾動圖文條

大概效果就是下圖這樣。

Android,淘寶,滾動圖文條,代碼

滾動圖文條

思路

  1. 寫一個不可用手滑動的RecyclerView
  2. 使用Handler定時RecyclerView自動滑動到下一個Item
  3. 使用smoothScrollToPosition使其平滑地滑動

開始工作

做一些基本工作

寫一個AdModel類。

public class AdModel {  public String title;  public String content;  public AdModel(String title, String content) {    this.title = title;    this.content = content;  }}

寫一些item_ad布局。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:id="@+id/layout"  android:layout_width="match_parent"  android:layout_height="50dp"  android:minHeight="50dp"  android:gravity="center_vertical"  android:orientation="horizontal"  android:background="@null"  tools:background="@color/black">  <LinearLayout    android:id="@+id/ll_ad"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_marginLeft="10dp"    android:layout_marginRight="10dp"    android:orientation="vertical">    <TextView      android:id="@+id/tv_title"      tools:text="會員身份0元搶"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:ellipsize="end"      android:lines="1"      android:textColor="@color/white"      android:textSize="12sp" />    <TextView      android:id="@+id/tv_content"      tools:text="送你體驗會員"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:ellipsize="end"      android:lines="1"      android:textColor="@color/white"      android:textSize="10sp" />  </LinearLayout>  <View    android:layout_width="0dp"    android:layout_height="0dp"    android:layout_weight="1"/>  <ImageView    android:id="@+id/iv_icon"    android:layout_width="30dp"    android:layout_height="30dp"    android:layout_marginRight="15dp"    android:src="@drawable/icon"/></LinearLayout>

寫AdAdapter類。

public class AdAdapter extends RecyclerView.Adapter<AdAdapter.ViewHolder> {  private Context mContext;  private OnItemClickListener onItemClickListener;  private LayoutInflater mInflater;  private List<AdModel> mDataList;  public AdAdapter(Context context, List<AdModel> datas) {    this.mContext = context;    mDataList = datas;    mInflater = LayoutInflater.from(context);  }  @Override  public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {    View itemView = mInflater.inflate(R.layout.item_ad, null);    return new ViewHolder(itemView);  }  @Override  public void onBindViewHolder(ViewHolder holder, final int p) {    if (mDataList == null || mDataList.size() ==0){      return;    }    if (holder != null) {      final int position = p % mDataList.size();      holder.mTvTitle.setText(mDataList.get(position).title);      holder.mTvContent.setText(mDataList.get(position).content);      holder.mIvIcon.setImageResource(R.drawable.icon);      holder.viewRoot.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {          if (onItemClickListener != null) {            onItemClickListener.onItemClick(v, position);          }        }      });    }  }  public void setOnItemClickListener(OnItemClickListener clickListener) {    this.onItemClickListener = clickListener;  }  @Override  public int getItemCount() {    return mDataList == null ? 0 : Integer.MAX_VALUE;  }  public class ViewHolder extends RecyclerView.ViewHolder {    public View viewRoot;    public TextView mTvTitle;    public TextView mTvContent;    public ImageView mIvIcon;    public ViewHolder(View itemView) {      super(itemView);      viewRoot = itemView.findViewById(R.id.layout);      mTvTitle = itemView.findViewById(R.id.tv_title);      mTvContent = itemView.findViewById(R.id.tv_content);      mIvIcon = itemView.findViewById(R.id.iv_icon);    }  }  /**   * RecyclerView的item點擊監聽接口   */  public interface OnItemClickListener {    void onItemClick(View v, int position);  }}

頁面activity_main布局。

<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout  xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:app="http://schemas.android.com/apk/res-auto"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  tools:context="com.cc.scrolladbar.MainActivity">  <android.support.v7.widget.RecyclerView    android:id="@+id/rv_ad"    android:layout_width="0dp"    android:layout_height="50dp"    android:layout_marginEnd="20dp"    android:layout_marginStart="20dp"    android:layout_marginTop="60dp"    android:nestedScrollingEnabled="false"    android:background="@color/black"    app:layout_constraintEnd_toEndOf="parent"    app:layout_constraintStart_toStartOf="parent"    app:layout_constraintTop_toTopOf="parent" /></android.support.constraint.ConstraintLayout>

重點代碼

在MainActivity中寫如下代碼。

package com.cc.scrolladbar;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.LinearSmoothScroller;import android.support.v7.widget.RecyclerView;import android.util.DisplayMetrics;import android.view.View;import java.util.ArrayList;import java.util.List;/** * Created by guoshichao on 2018/8/16 * QQ:1169380200 */public class MainActivity extends AppCompatActivity {  private static final int SCROLL_AD = 0;//會員輪播廣告  public static final int DEFAULT_SCROLL_INTERVAL = 3000;//會員輪播廣告間隔時間  public static final int DEFAULT_SCROLL_ANIMATION_TIME = 500;//會員輪播廣告動畫時長  private RecyclerView mRvAd;  private AdAdapter mAdapter;  private List<AdModel> mAdList;  private AdHandler mHandler;  private int nowScrollPosition = 0;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    initList();  }  @Override  public void onStart() {    super.onStart();    scrollVipAdOnce(nowScrollPosition);//防止滑動一半切到別的頁面使滑動完成    if (mHandler != null) {      sendScrollMessage(DEFAULT_SCROLL_INTERVAL);    }  }  @Override  public void onStop() {    super.onStop();    if (mHandler != null) {      mHandler.removeMessages(SCROLL_AD);    }  }  private void initList() {    mAdList = new ArrayList<>();    mAdList.add(new AdModel("第一條廣告標題", "我是第一條廣告的內容哦~"));    mAdList.add(new AdModel("第二條廣告標題", "我是第二條廣告的內容哦~"));    mAdList.add(new AdModel("第三條廣告標題", "我是第三條廣告的內容哦~"));    LinearLayoutManager manager = new LinearLayoutManager(this) {      @Override      public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {        LinearSmoothScroller smoothScroller = new LinearSmoothScroller(recyclerView.getContext()) {          // 為了平滑滑動返回:滑過1px時經歷的時間(ms)。          @Override          protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {            return (float) (DEFAULT_SCROLL_ANIMATION_TIME / displayMetrics.densityDpi);          }        };        smoothScroller.setTargetPosition(position);        startSmoothScroll(smoothScroller);      }    };    mRvAd = (RecyclerView) findViewById(R.id.rv_ad);    mRvAd.setLayoutManager(manager);    mAdapter = new AdAdapter(this, mAdList);    mRvAd.setAdapter(mAdapter);    mAdapter.setOnItemClickListener(new AdAdapter.OnItemClickListener() {      @Override      public void onItemClick(View v, int position) {        //點擊跳轉到指定廣告頁      }    });    mHandler = new AdHandler();    sendScrollMessage(DEFAULT_SCROLL_INTERVAL);  }  private void scrollVipAdOnce(int position) {    if (mAdList != null && mAdList.size() > 1) {      //平滑滑動到指定位置      mRvAd.smoothScrollToPosition(position);    }  }  private void sendScrollMessage(long delayMillis) {    mHandler.removeMessages(SCROLL_AD);    mHandler.sendEmptyMessageDelayed(SCROLL_AD, delayMillis);  }  private class AdHandler extends Handler {    @Override    public void handleMessage(Message msg) {      super.handleMessage(msg);      switch (msg.what) {        case SCROLL_AD:          nowScrollPosition++;          scrollVipAdOnce(nowScrollPosition);          sendScrollMessage(DEFAULT_SCROLL_INTERVAL);          break;        default:          break;      }    }  }}

重點分析

其中有一段代碼比較重要。

LinearLayoutManager manager = new LinearLayoutManager(this) {      @Override      public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {        LinearSmoothScroller smoothScroller = new LinearSmoothScroller(recyclerView.getContext()) {          // 為了平滑滑動返回:滑過1px時經歷的時間(ms)。          @Override          protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {            return (float) (DEFAULT_SCROLL_ANIMATION_TIME / displayMetrics.densityDpi);          }        };        smoothScroller.setTargetPosition(position);        startSmoothScroll(smoothScroller);      }    };

這里是為了平滑滑動。因為距離比較短小或者別的原因,mRvAd.smoothScrollToPosition(position)無法使其平滑地滑動。故加以上代碼。

我的完成圖如下。

Android,淘寶,滾動圖文條,代碼

滾動圖文條

寫在后面

這個Demo比較簡單,沒什么技術難點,如果還是有些不懂的,可以留言,我在文中可以做更多的解釋。如果有大佬有更好的解決方案,望指教。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 漳浦县| 维西| 江门市| 乐都县| 错那县| 德保县| 瑞丽市| 石家庄市| 长泰县| 陕西省| 贺州市| 丰台区| 神农架林区| 北票市| 屏南县| 华池县| 石棉县| 两当县| 温州市| 项城市| 行唐县| 厦门市| 榆中县| 昌黎县| 柏乡县| 温泉县| 大悟县| 定南县| 河曲县| 宜章县| 大同县| 自贡市| 孝义市| 正镶白旗| 罗平县| 弥渡县| 开远市| 页游| 涟源市| 商城县| 娱乐|