一个Android项目的总结

2019-05-23  本文已影响0人  csr_yang

从上周六开始准备开发,到今天测试通过正式验收。一共6天时间,完成了一个Android项目的开发。虽然这个项目比较简单,但是因为很久没有做Android开发了,还是多多少少碰到了一些技术问题并解决。这篇文章总结一下技术点,一些发现的问题以及解决的办法。

RecyclerView相关
  1. RecyclerView添加FooterView。
    思路:把footerview当做recycleView的一个item。在Adapter中重写getItemViewType(int position)方法getItemCount()。定义FooterViewHolder extends RecyclerView.ViewHolder然后在onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position)中针对footerview进行单独处理。
    关键代码如下:
     //为footerview设置单独的一种type
    public static final int TYPE_FOOTER = 1;
    @Override
    public int getItemViewType(int position) {
        if (position + 1  == mDatas.size() + 1){
            return TYPE_FOOTER;
        }
        return super.getItemViewType(position);
    }

    //item的数量+1,把footerview当做最后一个item
    @Override
    public int getItemCount() {
        return mDatas.size() + 1;
    }

  //创建一个单独的FooterViewHolder
  public class FooterViewHolder extends RecyclerView.ViewHolder{
  }

//根据type不同分别处理
  @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_FOOTER){
            final View footerView = LayoutInflater.from(mContext).inflate(R.layout.adapter_foot_view,parent,false);
            return new FooterViewHolder(footerView);
        }else {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_home_product,null);
            ViewHolder viewHolder = new ViewHolder(view);
            view.setOnClickListener(this);
            return viewHolder;
        }
    }


//对不同的holder进行处理
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        if (holder != null){
            if (holder instanceof  FooterViewHolder){
                ((FooterViewHolder)holder).ll_shop_entrance.setVisibility(mShop ? View.GONE : View.VISIBLE);

            }else{
              //其他item的处理
                  ......
            }
        }
  }

  1. RecyclerView item的点击事件处理。
    思路:使用代理设计模式。将处理事件放在要处理的代理对象那里处理。比如所在的Activity中处理。代码如下:
//定义一个接口
private OnItemClickListener mOnItemClickListener = null;

   public static interface OnItemClickListener {
        void onItemClick(View view , int position);
    }
//对整个itemView注册点击事件

    @Override
    public void onClick(View view) {

        if (mOnItemClickListener != null){
            mOnItemClickListener.onItemClick(view,(int)view.getTag());
        }
    }

//对外部保暴露一个设置监听器的方法
    public void setOnItemClickListener(OnItemClickListener listener){
        this.mOnItemClickListener = listener;
    }

        //然后在adapter创建的地方,使用监听器。
        //列表item跳转
       adapter.setOnItemClickListener(new HomeProductAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            //点击要做的事情..
        }
      });
  1. 为recyclerview item添加边距

思路:创建一个RecyclerView.ItemDecoration的子类,然后重写getItemOffsets方法

//设置item的下边距为20
recyclerview.addItemDecoration(new SpacesItemDecoration(20));

//SpacesItemDecoration.java

    private int bottom;

    public SpacesItemDecoration(int bottom) {
        this.bottom = bottom;
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDraw(c, parent, state);
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);

        LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
        if (layoutManager.getOrientation() == LinearLayoutManager.VERTICAL){
            outRect.bottom = bottom;

        }
    }

  1. RecyclerView下拉刷新加载更多
    使用第三方控件UltimateRecyclerView
        recyclerView.setDefaultOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {

            }
        });

        recyclerView.setOnLoadMoreListener(new UltimateRecyclerView.OnLoadMoreListener() {
            @Override
            public void loadMore(int itemsCount, int maxLastVisiblePosition) {


            }
        });
Webview相关
  1. 加载url 出现空白,图片显示不全等问题。
    解决方法:初始化webview时需要进行一些设置,不能使用默认的设置。
        WebSettings settings = webView.getSettings();
        settings.setDomStorageEnabled(true);
        settings.setJavaScriptEnabled(true);
        settings.setBlockNetworkImage(false);
        settings.setLoadsImagesAutomatically(true);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ){
            webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }
  1. webview加载本地html
    主要就是从assets文件夹加载content 然后webview加载内容
        String content = getFromAssets(String.format("%s.html",fileName));
        webView.loadDataWithBaseURL(null, content, "text/html", "utf-8", null);

上一篇下一篇

猜你喜欢

热点阅读