GVKun编程网logo

Java 相关 | Code Review Checklist (Server)(Java 相关新技术)

27

在这篇文章中,我们将为您详细介绍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 相关新技术)

Java 相关 | Code Review Checklist (Server)(Java 相关新技术)

安全
  1. 所有入参均经过校验,包括验证参数数据类型、范围、长度,尽可能采用白名单形式验证所有的输入。对于非法请求,记录 WARN log。参考 Input Validation Cheat Sheet;前后端统一校验标准,最好统一自动生成代码。
  2. 避免拼接客户端可控参数到 SQL 语句,采用预编译形式执行 SQL,尽可能使用 #{},特殊场景需使用 ${} 时必须对参数做严格校验,比如限制类型、长度等。
  3. 对于服务端内部异常,统一返回 Error Code 和 Error Message,避免返回 Stacktrace 等内部系统细节,参考统一异常处理 & 错误码规范使用说明。
  4. 所有接口读写敏感数据前必须增加 session 鉴权,校验数据归属为当前登录账户。
  5. 敏感信息不要硬编码到代码中(比如密码等)。
  6. 非公开页面或资源,必须要求服务端身份验证。
  7. 符合 Least Privilege 原则,具备逻辑严密的权限配置。
  8. 重要数据变动皆有审计日志,日志中不要保存敏感信息(系统详细信息、会话 session 或密码等)。
  9. 所有上传文件类型必须要做白名单检查,且统一存储到 OSS。
  10. 禁止在代码中留任何形式的后门
兼容性
  1. 所有的模块外部接口不存在兼容性问题;
  2. 如果有 DB Migration,说明需在发布前或发布后执行,兼容平滑发布;
  3. 所有的 DB Schema 变动均已考虑对统计的影响;
  4. 数据的含义或处理逻辑有变更时,考虑对存量 / 在途数据的影响;
性能
  1. 相关 DB 查询有恰当的索引;
  2. 接口处理时间与数据库中既有数据量不存在相关性;
  3. 批量数据处理、定时任务、离线处理等重度 DB 和计算的任务,需与业务进程隔离,尽可能用只读数据源;
  4. 严格控制批量导入功能的开发;
  5. 对与高 Hit Ratio 的查询进行缓存处理。数据更新时,根据业务需求采用合适的缓存刷新策略;
  6. 全文搜索相关的使用 ES 进行支持;
  7. 没有 WHERE 的语句需要加上 LIMIT;
质量
  1. 相当的可读性,可自解释,不可自解释的地方有相应的注释。外部接口有详细 Java Doc,DB Schema 有详细注释,并有相应的 E-R 图;
  2. 主要流程被 Unit Test 覆盖;
  3. 通过 SonarLint 检测没有严重 Issue;
  4. DB 业务关键字段加上 NOT NULL Constraint;
标准
  1. HTTP Return Code
  2. 正常请求返回 200
  3. 非法参数返回 400
  4. 未登录或没有权限返回 403
  5. 服务器内部错误返回 500,并给出 Error ID (Request ID),但隐藏 Error 细节
  6. 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

/Users/macbook/Library/Developer/Xcode/DerivedData/MapViewDemo: No such file or direc


 
 
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Fantasy_Jun/article/details/78270543

错误如下:

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头部固定

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的问题

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?

android – 如何在RecyclerView中的CardView上使用OnClickListner?

我尝试做这样的事情:

enter image description here


我的问题是当我点击我的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?等相关内容,可以在本站寻找。

本文标签: