版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xyzso1z/article/details/84101049
2.2.0开发总结
1. 遇到的问题
1. 翻页
显示屏等待呼叫列表开发需求:
- 每页显示6行
- 共展示2页
- 每页显示4s后自动显示下一页 最后一页显示完后显示第一页
List<TTicket> waitingTicketList = Collections.synchronizedList(new ArrayList<TTicket>());//用于储存等待的号
private int page = 1;
private class PageThread extends Thread {
private volatile boolean running = true;
@Override
public void run() {
while (running) {
try {
showWaitingList();
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
}
}
private void showWaitingList() {
int start = (page - 1) * 6;
int end = waitingTicketList.size() < page * 6 ? waitingTicketList.size() : (page * 6);
if (waitingTicketList.size() > start) {
List<TTicket> temp = new ArrayList<>(waitingTicketList.subList(start, end));
waitingAdapter.setShowList(temp);//把需要显示的list设置给Adapter
runOnUiThread(new Runnable() {
@Override
public void run() {
waitingAdapter.notifyDataSetChanged();//让Adapter更新数据
}
});
page++;
} else {
page = 1;
}
}
public class Adapter extends RecyclerView.Adapter<ItemViewHolder> {
List<TTicket> ticketList = null;
public void setShowList(List<TTicket> list) {
ticketList = list;
}
}
找bug:
- 当等待叫号的列表只有一个号A,此时显示屏只有显示A号显示是正确的,当某台叫号机把A 号叫走,此时显示屏显示不变
- 最后一屏的显示两倍时长
修改后:
private void showWaitingList() {
int start = (page - 1) * 6;
int end = waitingTicketList.size() < page * 6 ? waitingTicketList.size() : (page * 6);
if (waitingTicketList.size() > start || (waitingTicketList.size() == start && page == 1)) {
page++;
} else {
page = 1;
start = (page - 1) * 6;
end = waitingTicketList.size() < page * 6 ? waitingTicketList.size() : (page * 6);
page++;
}
List<TTicket> temp = new ArrayList<>(waitingTicketList.subList(start, end));
waitingAdapter.setShowList(temp);
runOnUiThread(new Runnable() {
@Override
public void run() {
waitingAdapter.notifyDataSetChanged();
}
});
}
如何减少这样的问题:临界值的处理流程在草稿纸上模拟一下
2.Dialog大小
public class BaseDialog {
protected Activity activity;
private boolean isShowing = false;
private ViewGroup parentView;
protected View dialogView;
public BaseDialog(Activity context) {
this.activity = context;
}
public BaseDialog(Activity context, int resLayoutId) {
this.activity = context;
dialogView = LayoutInflater.from(activity).inflate(resLayoutId, null);
}
public void setContentView(int resLayoutId) {
dialogView = LayoutInflater.from(activity).inflate(resLayoutId, null);
}
public void setContentView(View view) {
dialogView = view;
}
public void show() {
if (dialogView != null && !isShowing) {
parentView=(activity.getWindow().getDecorView().findViewById(android.R.id.content));
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
parentView.addView(dialogView, lp);
dialogView.setClickable(true);
isShowing = true;
}
}
public View findViewById(int id) {
if (dialogView != null) {
return dialogView.findViewById(id);
}
return null;
}
public void dismiss() {
if (isShowing && parentView != null) {
parentView.removeView(dialogView);
isShowing = false;
}
}
public boolean isShowing() {
return isShowing;
}
}
以后要注意的地方
- 修复bug时要全方位考虑否则可能引入更多的bug(语音的初始化)
- 当优化时,如果发现代码因为修改而变得混乱或者逻辑不清晰应该及时重新设计代码(签署机)
- 在测试时注释掉正在使用的代码 当测试结束后应该记住把注释的代码解开
- 需求理解透后再用手写代码
- Code Review
附录
- 不一样的翻页
1、
private final int PAGE_SIZE = 8; //单页显示留观时间数量
private final int PER_PAGE_SHOW_TIME = 5 * 1000; //翻页间隔时间,5秒
class PageThread extends Thread {
private int currentPage = 1;
private volatile boolean running = true;
public PageThread(int currentPage) {
this.currentPage = currentPage;
}
@Override
public void run() {
while (running) {
try {
Thread.sleep(PER_PAGE_SHOW_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
if (running) {
runOnUiThread(new Runnable() {
@Override
public void run() {
nextPage();
}
});
}
}
}
private void nextPage() {
if (allObservingTicketList.size() > PAGE_SIZE) {
int totalPage = allObservingTicketList.size() / PAGE_SIZE;
int left = allObservingTicketList.size() % PAGE_SIZE;
if (left > 0) {
totalPage++;
}
if (currentPage < totalPage) {
currentPage++;
int startIndex = (currentPage - 1) * PAGE_SIZE;
adapter.setStartIndex(startIndex);
} else {
currentPage = 1;
dapter.setStartIndex(0);
}
} else {
currentPage = 1;
adapter.setStartIndex(0);
}
adapter.notifyDataSetChanged();
}
public class Adapter extends RecyclerView.Adapter<ItemViewHolder> {
private int startIndex = 0;
public void setStartIndex(int startIndex) {
this.startIndex = startIndex;
}
@Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
position = startIndex + position;
}
@Override
public int getItemCount() {
return PAGE_SIZE;
}
}
2、
public class RecyclerViewScrollRunnable implements Runnable {
private static final int SCROLL_DELAY_TIME = 8 * 1000;
private RecyclerView recyclerView;
private LinearLayoutManager layoutManager;
private Handler handler = new Handler(Looper.getMainLooper());
private int delayTime = SCROLL_DELAY_TIME;
private boolean isRunning;
public RecyclerViewScrollRunnable(RecyclerView recyclerView, LinearLayoutManager layoutManager) {
this.recyclerView = recyclerView;
this.layoutManager = layoutManager;
}
public void start() {
if (isRunning) {
return;
}
isRunning = true;
handler.removeCallbacks(this);
handler.postDelayed(this, delayTime);
}
public void stop() {
isRunning = false;
handler.removeCallbacks(this);
}
@Override
public void run() {
if (recyclerView == null || layoutManager == null || recyclerView.getAdapter() == null) {
isRunning = false;
return;
}
RecyclerView.Adapter adapter = recyclerView.getAdapter();
if (adapter instanceof Scrollable) {
Scrollable scrollable = (Scrollable) adapter;
int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
int countVisibleItem = lastVisibleItemPosition - firstVisibleItemPosition + 1;//每页展示的数目
int realCount = scrollable.getRealCount();
if (realCount > countVisibleItem ) {
int smoothPosition;
if (lastVisibleItemPosition >= realCount - 1 && firstVisibleItemPosition >= 0) {
smoothPosition = 0;
} else {
smoothPosition = lastVisibleItemPosition;
}
smoothMoveToPosition(smoothPosition);
}
handler.postDelayed(this, delayTime);
} else {
stop();
}
}
private void smoothMoveToPosition(int n) {
layoutManager.scrollToPositionWithOffset(n, 0);
}
}
public interface Scrollable {
int getRealCount();
}
public class Adapter extends RecyclerView.Adapter<ItemViewHolder> implements Scrollable {
@Override
public int getRealCount() {
return ticketList.size();
}
}