轉(zhuǎn)載請注明原創(chuàng)出處,謝謝!
- GitHub: @Ricco
一屏多行公告實現(xiàn)邏輯(中獎公告效果,直播聊天效果,垂直滾動)

效果圖.gif
ps:最近在寫app活動抽獎,需要了一些比較有意思的需求,記錄一下。
主要實現(xiàn)中獎公告,1頁顯示多條,一條頂一條的滾動的效果。
- 一開始使用了viewpager,但是一屏多條實現(xiàn)起來有些困難,
- 后來也使用了LinearLayout使用addview的添加View,通過LayoutTransition的屬性動畫,來控制一條頂一條的效果,但是擴(kuò)展性較差。
- 后來想到了使用RecyclerView的LayoutManager,控制移動到指定位置,最后寫的時候發(fā)現(xiàn),BRVAH萬能適配器這個庫的添加和刪除數(shù)據(jù)時候自帶的效果就可以實現(xiàn)。只要禁止RecyclerView的手動滑動即可。
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.xiaodou.mobile.R;
import com.xiaodou.mobile.base.BaseActivity;
import com.xiaodou.mobile.ui.adapter.AAAAAdapter;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.OnClick;
public class TestActivity extends BaseActivity {
@BindView(R.id.rv)
RecyclerView rv;
private ItemAdapter adapter = new ItemAdapter ();
// 用來實現(xiàn)無限循環(huán)效果
private int count = 0;
// 數(shù)據(jù)
private List<String> list = new ArrayList<>();
@Override
protected void onResume() {
super.onResume();
handler.sendEmptyMessageDelayed(1, 1000);
}
@Override
protected void onPause() {
super.onPause();
handler.removeCallbacksAndMessages(null);
}
@Override
protected void onDestroy() {
super.onDestroy();
handler.removeCallbacksAndMessages(null);
handler = null;
}
@Override
public int getLayoutRes() {
return R.layout.dou_activity_test;
}
@Override
public void afterLoadLayout(Bundle savedInstanceState) {
rv.setLayoutManager(new LinearLayoutManager(context) {
// 禁止手動滑動
@Override
public boolean canScrollVertically() {
return false;
}
});
rv.setAdapter(adapter);
}
// 模擬網(wǎng)絡(luò)請求
@OnClick(R.id.btnStart)
public void onViewClicked() {
list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
list.add("data" + i);
}
// 一屏顯示3條
count = 3;
// BRAVH,一定要注意new ArrayList(),否則會有數(shù)據(jù)引用問題
adapter.setNewData(new ArrayList<>(list.subList(0, count)));
handler.sendEmptyMessageDelayed(1, 1000);
}
@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (list == null || list.size() == 0 || count < 0) {
return;
}
// 底部加一條
adapter.addData(list.get(count++ % list.size()));
// 頂部減一條
adapter.remove(0);
sendEmptyMessageDelayed(1, 1000);
}
};
}