Android多行公告实现逻辑(中奖公告,直播左下角效果)
转载请注明原创出处,谢谢!
一屏多行公告实现逻辑(中奖公告效果,直播聊天效果,垂直滚动)
ps:最近在写app活动抽奖,需要了一些比较有意思的需求,记录一下。
主要实现中奖公告,1页显示多条,一条顶一条的滚动的效果。
- 一开始使用了viewpager,但是一屏多条实现起来有些困难,
- 后来也使用了LinearLayout使用addview的添加View,通过LayoutTransition的属性动画,来控制一条顶一条的效果,但是扩展性较差。
- 后来想到了使用RecyclerView的LayoutManager,控制移动到指定位置,最后写的时候发现,BRVAH万能适配器这个库的添加和删除数据时候自带的效果就可以实现。只要禁止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 ();
// 用来实现无限循环效果
private int count = 0;
// 数据
private List 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);
}
// 模拟网络请求
@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(),否则会有数据引用问题
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);
}
};
}
共有 0 条评论