廢話很少說,先看效果:
java
demo地址: github.com/lxykad/vert…android
首先產品需求是紅色背景的那個view的效果。最早想到的固然是世界上最大的同性交友社區GitHub,因而找到了最上面那個999跑馬燈的效果,這特麼明顯和需求不同,算了,本身擼一個吧。git
我是一個比較懶的人,首先固然是先找系統控件了,因而想用ViewFlipper來實現,直接在xml佈局裏寫上:github
<ViewFlipper
android:id="@+id/view_flipper"
android:layout_width="match_parent"
android:layout_height="100dp">
</ViewFlipper>複製代碼
代碼裏幾行代碼 設置一下完事安全
mFlipper.addView(tv1);
mFlipper.addView(tv2);
mFlipper.addView(tv3);
mFlipper.setInAnimation(this, R.anim.headline_in);//進入動畫
mFlipper.setOutAnimation(this, R.anim.headline_out);//出去動畫
mFlipper.setFlipInterval(2000);//時間
mFlipper.startFlipping();複製代碼
因而gif圖裏中間的效果就實現了,和京東淘寶啥的熱門推薦效果同樣同樣的(ui細節本身根據需求調一下就哦了,不要在乎這些,這裏僅僅提供思路做爲參考)。bash
不過和我要的效果仍是有差距啊,我要顯示3行的,沒辦法,再換個思路吧……,用recyclerview實現,大概思路以下:服務器
一、固定三行顯示的高度,好比90dpide
二、item的高度固定爲30dp,這樣恰好顯示3行oop
三、用一個線程安全的消息隊列存放服務器推送過來的數據佈局
四、寫一個輪詢(我這裏用rxjava實現),每隔3秒去隊列查詢一次數據,若是列表數據少於3條,直接顯示。若是列表數據大於等於3條的畫,先添加一條,而後再移除第一條。
主要代碼以下:
//3秒輪詢一次消息隊列
public void startLoop() {
Observable.interval(3, TimeUnit.SECONDS)
.observeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Long value) {
System.out.println("loop==========:" + mQueue.size());
showMsg();
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}複製代碼
recyclerview的展現邏輯
public void showMsg() {
if (mQueue.size() == 0) {
return;
}
try {
NewsBean bean = mQueue.take();
if (mList.size() > 2) {
mAdapter.addData(bean);
mAdapter.remove(0);
} else {
mAdapter.addData(bean);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}複製代碼
真正實現起來很是簡單。第一次寫文章,一篇簡單的文章碼到凌晨12點多了(好尷尬),若是對你有幫助,麻煩GitHub給個start鼓勵一下,[捂臉]!