在这篇文章中,我们将为您详细介绍Java相关|CodeReviewChecklist(Server)的内容,并且讨论关于Java相关新技术的相关问题。此外,我们还会涉及一些关于/Users/macbo
在这篇文章中,我们将为您详细介绍Java 相关 | Code Review Checklist (Server)的内容,并且讨论关于Java 相关新技术的相关问题。此外,我们还会涉及一些关于/Users/macbook/Library/Developer/Xcode/DerivedData/MapViewDemo: No such file or direc、Android StickHeaderRecyclerView - 让recyclerview头部固定、android – 在RecyclerView中使用CardView和OnClickListener的问题、android – 如何在RecyclerView中的CardView上使用OnClickListner?的知识,以帮助您更全面地了解这个主题。
本文目录一览:- Java 相关 | Code Review Checklist (Server)(Java 相关新技术)
- /Users/macbook/Library/Developer/Xcode/DerivedData/MapViewDemo: No such file or direc
- Android StickHeaderRecyclerView - 让recyclerview头部固定
- android – 在RecyclerView中使用CardView和OnClickListener的问题
- android – 如何在RecyclerView中的CardView上使用OnClickListner?
Java 相关 | Code Review Checklist (Server)(Java 相关新技术)
安全
- 所有入参均经过校验,包括验证参数数据类型、范围、长度,尽可能采用白名单形式验证所有的输入。对于非法请求,记录 WARN log。参考 Input Validation Cheat Sheet;前后端统一校验标准,最好统一自动生成代码。
- 避免拼接客户端可控参数到 SQL 语句,采用预编译形式执行 SQL,尽可能使用 #{},特殊场景需使用 ${} 时必须对参数做严格校验,比如限制类型、长度等。
- 对于服务端内部异常,统一返回 Error Code 和 Error Message,避免返回 Stacktrace 等内部系统细节,参考统一异常处理 & 错误码规范使用说明。
- 所有接口读写敏感数据前必须增加 session 鉴权,校验数据归属为当前登录账户。
- 敏感信息不要硬编码到代码中(比如密码等)。
- 非公开页面或资源,必须要求服务端身份验证。
- 符合 Least Privilege 原则,具备逻辑严密的权限配置。
- 重要数据变动皆有审计日志,日志中不要保存敏感信息(系统详细信息、会话 session 或密码等)。
- 所有上传文件类型必须要做白名单检查,且统一存储到 OSS。
- 禁止在代码中留任何形式的后门
兼容性
- 所有的模块外部接口不存在兼容性问题;
- 如果有 DB Migration,说明需在发布前或发布后执行,兼容平滑发布;
- 所有的 DB Schema 变动均已考虑对统计的影响;
- 数据的含义或处理逻辑有变更时,考虑对存量 / 在途数据的影响;
性能
- 相关 DB 查询有恰当的索引;
- 接口处理时间与数据库中既有数据量不存在相关性;
- 批量数据处理、定时任务、离线处理等重度 DB 和计算的任务,需与业务进程隔离,尽可能用只读数据源;
- 严格控制批量导入功能的开发;
- 对与高 Hit Ratio 的查询进行缓存处理。数据更新时,根据业务需求采用合适的缓存刷新策略;
- 全文搜索相关的使用 ES 进行支持;
- 没有 WHERE 的语句需要加上 LIMIT;
质量
- 相当的可读性,可自解释,不可自解释的地方有相应的注释。外部接口有详细 Java Doc,DB Schema 有详细注释,并有相应的 E-R 图;
- 主要流程被 Unit Test 覆盖;
- 通过 SonarLint 检测没有严重 Issue;
- DB 业务关键字段加上 NOT NULL Constraint;
标准
- HTTP Return Code
- 正常请求返回 200
- 非法参数返回 400
- 未登录或没有权限返回 403
- 服务器内部错误返回 500,并给出 Error ID (Request ID),但隐藏 Error 细节
- Git Commit 的 Comment 需带上禅道的 Issue No,如: TASK-\d+ *** 或者 BUG-\d+ ***
/Users/macbook/Library/Developer/Xcode/DerivedData/MapViewDemo: No such file or direc
/Users/macbook/Library/Developer/Xcode/DerivedData/MapViewDemo: No such file or direc
错误如下:
make directory /Users/macbook/Library/Developer/Xcode/DerivedData/MapViewDemo-ObjC-frvwzweptunabjgecjimiqyznkzu/Build/Products/Debug-iphonesimulator/MapViewDemo-ObjC.app/ArcGIS.bundle/ar.lproj: No such file or directory
- 1
原因:文件重复
解决方法:删除项目中重复的报错文件,如我的是删除.bundle 文件
Android StickHeaderRecyclerView - 让recyclerview头部固定
介绍
在项目中有时会需要recyclerview滑动式时某个view滑出后会固定在头部显示,比较常用的比如手机联系人界面、地区选择界面等。 StickHeaderRecyclerView就是实现这个功能的。效果图:
这样的控件网上一抓一大把了,本控件的优点就是使用简单- lib简单 - 使用的语法也简单(之前下了2个类似开源项目,都是上万行代码。读起来麻烦、改起来麻烦就自己写了这个控件)
使用
只需要让你的adapter实现StickHeaderDecoration.StickHeaderInterface接口,方法boolean isStick(int position)中返回的值就标识当前位置的view是否需要固定。
同时需要让Adapter中的item不复用(如果怕影响性能也可以单独让需要固定的view不复用) 在adapter构造方法中setHasStableIds(true); 同时复写adapter的public long getItemId(int position) {return position;}
上代码
public class NormalAdapter extends RecyclerView.Adapter<NormalAdapter.InnerHolder> implements StickHeaderDecoration.StickHeaderInterface{
NormalAdapter(Activity activity, List<String> dates){
this.activity = activity;
this.dates = dates;
}
@Override
public boolean isStick(int position) {
return position % 6 == 0;
}
Activity activity;
private List<String> dates;
@Override
public InnerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View inflate = LayoutInflater.from(activity).inflate(R.layout.item, parent,
false);
return new InnerHolder(inflate);
}
@Override
public void onBindViewHolder(InnerHolder holder, int position) {
if(isStick(position)){
holder.itemView.setBackgroundResource(R.color.colorAccent);
holder.tvText.setText(position / 6 +"");
}else{
holder.itemView.setBackgroundResource(R.color.white);
holder.tvText.setText(dates.get(position));
}
}
@Override
public int getItemCount() {
return dates.size();
}
class InnerHolder extends RecyclerView.ViewHolder{
TextView tvText;
public InnerHolder(View itemView) {
super(itemView);
tvText = (TextView) itemView.findViewById(R.id.tvText);
}
}
}
activity代码
public class MainActivity extends Activity {
private RecyclerView recycle;
private List<String> dates = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recycle = (RecyclerView) findViewById(R.id.recycle);
for(int i=0;i<66;i++){
dates.add("date : "+i);
}
recycle.setLayoutManager(new LinearLayoutManager(this));
recycle.setAdapter(new NormalAdapter(this, dates));
recycle.addItemDecoration(new StickHeaderDecoration(recycle));
}
}
完成了
原理
先上核心类代码
public class StickHeaderDecoration extends RecyclerView.ItemDecoration {
public interface StickHeaderInterface {
/**
* is this item need stick
* @param position now item position in the recyclerView
* @return true : need stick else not
*/
boolean isStick(int position);
}
private RecyclerView recyclerView;
private RecyclerView.LayoutManager manager;
private RecyclerView.Adapter adapter;
private StickHeaderInterface stickHeaderInterface;
/**
* 进行一些容错检查
*/
public StickHeaderDecoration(RecyclerView recyclerView) {
this.recyclerView = recyclerView;
this.manager = recyclerView.getLayoutManager();
this.adapter = recyclerView.getAdapter();
if (adapter == null) {
throw new RuntimeException("please set Decoration after set adapter");
}
if (adapter instanceof StickHeaderInterface) {
stickHeaderInterface = (StickHeaderInterface) adapter;
return;
}
throw new RuntimeException("please make your adapter implements StickHeaderInterface");
}
/**
* 绘制头部的stick view
*/
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDrawOver(c, parent, state);
View childAt = parent.getChildAt(0);
if (childAt == null)
return;
RecyclerView.ViewHolder childViewHolder = parent.getChildViewHolder(childAt);
int position = childViewHolder.getPosition();
for (int i = position; i >= 0; i--) {
if (stickHeaderInterface.isStick(i)) {
int top = 0;
if (position + 1 < adapter.getItemCount()) {
if (stickHeaderInterface.isStick(position + 1)) {
View childNext = parent.getChildAt(1);
top = manager.getDecoratedTop(childNext) < 0 ? 0 : manager
.getDecoratedTop(childNext);
}
}
RecyclerView.ViewHolder inflate = recyclerView.getAdapter().createViewHolder(parent,
recyclerView.getAdapter().getItemViewType(i));
recyclerView.getAdapter().bindViewHolder(inflate, i);
int measureHeight = getMeasureHeight(inflate.itemView);
c.save();
if (top < inflate.itemView.getMeasuredHeight() && top > 0) {
c.translate(0, top - measureHeight);
}
inflate.itemView.draw(c);
c.restore();
return;
}
}
}
/**
* 测量控件的高度
*
* @param header
*/
private int getMeasureHeight(View header) {
int widthSpec = View.MeasureSpec.makeMeasureSpec(recyclerView.getWidth(), View
.MeasureSpec.EXACTLY);
int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
header.measure(widthSpec, heightSpec);
header.layout(0, 0, header.getMeasuredWidth(), header.getMeasuredHeight());
return header.getMeasuredHeight();
}
}
首先ItemDecoration是一个接口,通过RecyclerView的 recycle.addItemDecoration方法设置进去
其中只有6个方法其中3个过时了。我们这儿只需要对onDrawOver进行操作。
onDrawOver是当前RecyclerView绘制完毕后调用,可以其中进行绘制。我们的头部固定其实就是在这个方法中绘制进去的。
算法
1.这儿我们需要判断当前显示item的前面是否有需要固定的item(这儿取名为beforitem)如果有则绘制在顶部
2.我们还需要当第二个固定的item把前面的item慢慢顶上去的效果,这儿通过判断当前显示的第一个item的下一个item是否需要固定,如果需要则通过manager.getDecoratedTop(childNext)获取这个item距离顶部的距离然后通过计算把beforitem先上移动一定的距离。
基本原理就这样,相信代码更加有说服力,github 地址
https://github.com/LiuLinXin/StickHeaderRecyclerView-philer
待优化
头部view现在是通过ondraw绘制进去的,不能相应点击事件等。暂时没相处好的解决办法,希望有想法的朋友提示下。
android – 在RecyclerView中使用CardView和OnClickListener的问题
我使用CardView布局作为RecyclerView的Row.但是,我在将OnClickListener附加到布局时遇到问题.
我正在使用以下布局
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/unit_5"
android:clickable="true"
android:longClickable="true"
card_view:cardCornerRadius="@dimen/unit_5">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/spinnerWidth"
android:background="@drawable/row_item_background"
android:clickable="true"
android:orientation="vertical"
android:padding="@dimen/dialog_left_padding">
<!-- Other items -->
</LinearLayout>
</android.support.v7.widget.CardView>
以下是我的适配器和ViewHolder
private class SampleAdapter extends RecyclerView.Adapter<SampleViewHolder> {
ArrayList<Item> arrayList;
private LayoutInflater inflater;
public SampleAdapter(Context context) {
inflater = LayoutInflater.from(context);
this.arrayList = new ArrayList<>();
arrayList.addAll(items);
}
@Override
public SampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.layout1, parent, false);
SampleViewHolder holder = new SampleViewHolder(view);
holder.setClickHandler(handler);
return holder;
}
@Override
public void onBindViewHolder(SampleViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return arrayList.size();
}
}
static class SampleViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
TextView name;
IClickHandler clickHandler;
public IClickHandler getClickHandler() {
return clickHandler;
}
public void setClickHandler(IClickHandler clickHandler) {
this.clickHandler = clickHandler;
}
public SampleViewHolder(View itemView) {
super(itemView);
name = (TextView) itemView
.findViewById(R.id.name);
itemView.setonClickListener(this);
itemView.setonLongClickListener(this);
}
@Override
public void onClick(View view) {
if (getClickHandler() != null) {
getClickHandler().onItemClicked(view, getLayoutPosition());
}
}
@Override
public boolean onLongClick(View view) {
if (getClickHandler() != null) {
getClickHandler().onItemLongClicked(view, getLayoutPosition());
}
return true;
}
}
但是这个onClick永远不会被解雇.
但是,如果我用LinearLayout替换CardView,每件事都可以.
我不知道这里有什么问题.有人可以帮助我吗?
谢谢.
解决方法:
实际上实现onClick非常简单,我不确定自定义点击处理程序(IClickHandler)的实现.
首先,View持有人应该只是:
static class SampleViewHolder extends RecyclerView.ViewHolder {
TextView name;
public SampleViewHolder(View itemView) {
super(itemView);
name = (TextView) itemView.findViewById(R.id.name);
}
}
然后在SampleAdapter中
@Override
public SampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.layout1, parent, false);
SampleViewHolder holder = new SampleViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(SampleViewHolder holder, int position) {
final Item item = arrayList.get(position);
holder.name.setonClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
//notice I implemented onClickListener here
// so I can associate this click with final Item item
}
});
}
android – 如何在RecyclerView中的CardView上使用OnClickListner?
我尝试做这样的事情:
我的问题是当我点击我的ImageView时,我的CardView被扩展了,但第n个CardView也被扩展了,它采用了我点击的扩展的CardView.我不明白为什么我的onClick方法也适用于其他CardView.
我的适配器
public class CardsViewAdapter extends RecyclerView.Adapter<CardsViewAdapter.ViewHolder> {
private Game[] mDataset;
int rotationAngle = 0;
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class ViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public TextView mTextView;
public ImageView imageView;
public LinearLayout test2;
public TextView test3;
boolean isPopupVisible;
public ViewHolder(View v) {
super(v);
mTextView = (TextView) v.findViewById(R.id.text_cards);
imageView = (ImageView) v.findViewById(R.id.item_description_game_more);
test2 = (LinearLayout) v.findViewById(R.id.popup_layout);
test3 = (TextView) v.findViewById(R.id.test_view);
isPopupVisible = false;
}
}
// Provide a suitable constructor (depends on the kind of dataset)
public CardsViewAdapter(Game[] myDataset) {
mDataset = myDataset;
}
// Create new views (invoked by the layout manager)
@Override
public CardsViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.cards_resume_game, parent, false);
// set the view's size, margins, paddings and layout parameters
//...
ViewHolder vh = new ViewHolder(v);
return vh;
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
//Todo : complete
final int pos = position;
holder.mTextView.setText(String.valueOf(mDataset[position].getId_game()));
holder.imageView.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("POS","actual pos = "+pos);
holder.test3.setText("Position : "+pos);
// Perform action on click
if (holder.isPopupVisible) {
holder.isPopupVisible = false;
ObjectAnimator anim = ObjectAnimator.ofFloat(v, "rotation",rotationAngle, rotationAngle + 180);
anim.setDuration(500);
anim.start();
rotationAngle += 180;
rotationAngle = rotationAngle%360;
CardsAnimationHelper.collapse(holder.test2);
} else {
holder.isPopupVisible = true;
ObjectAnimator anim = ObjectAnimator.ofFloat(v, "rotation",rotationAngle, rotationAngle + 180);
anim.setDuration(500);
anim.start();
rotationAngle += 180;
rotationAngle = rotationAngle%360;
CardsAnimationHelper.expand(holder.test2);
}
}
});
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return mDataset.length;
}
}
解决方法:
我想你已经有了Game类.只需在名为expanded的类中添加一个新属性即可.
public Class Game {
public int id;
public String description;
// Add an extra attribute to track the checked status
// By default, set the checked status to false
public boolean expanded = false;
}
现在,由于您现在拥有跟踪展开状态的属性,因此您可以轻松地执行此类操作.
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
final int pos = position;
holder.mTextView.setText(String.valueOf(mDataset[position].id));
// Set the expanded or collapsed mode here
if(mDataset[position].expanded) expandView(holder.test2);
else collapseView(holder.test2);
// Now set the onClickListener like this
holder.imageView.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.test3.setText("Position : "+pos);
// Animate the imageView here
animateImageView(holder.imageView);
// Toggle the expanded attribute value
if(mDataset[position].expanded) mDataset[position].expanded = false;
else mDataset[position].expanded = true;
// Now call notifyDataSetChanged to make the change to effect
refreshList();
}
});
}
// Extra functions inside your adapter class to improve readability
private void collapseView(View view) {
CardsAnimationHelper.collapse(view);
}
private void expandView(View view) {
CardsAnimationHelper.expand(view);
}
private void animateImageView(ImageView imageView) {
ObjectAnimator anim = ObjectAnimator.ofFloat(imageView, "rotation",rotationAngle, rotationAngle + 180);
anim.setDuration(animationDuration);
anim.start();
rotationAngle += 180;
rotationAngle = rotationAngle % 360;
}
long animationDuration = 500;
private void refreshList() {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
}, animationDuration);
}
关于Java 相关 | Code Review Checklist (Server)和Java 相关新技术的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于/Users/macbook/Library/Developer/Xcode/DerivedData/MapViewDemo: No such file or direc、Android StickHeaderRecyclerView - 让recyclerview头部固定、android – 在RecyclerView中使用CardView和OnClickListener的问题、android – 如何在RecyclerView中的CardView上使用OnClickListner?等相关内容,可以在本站寻找。
本文标签: