美文网首页
一个Android项目的总结

一个Android项目的总结

作者: csr_yang | 来源:发表于2019-05-23 18:46 被阅读0次

    从上周六开始准备开发,到今天测试通过正式验收。一共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);
    
    

    相关文章

      网友评论

          本文标题:一个Android项目的总结

          本文链接:https://www.haomeiwen.com/subject/ifjbzqtx.html