Android学习笔记(四)-----RecyclerView,WebView

(2-11)RecyclerView


其官方定义是:A flexible view for providing a limited window into a large data set

能够灵活的实现大数据集的展示,视图的复用管理比ListView更好,能够显示列表,网格,瀑布流等形式,且不同的ViewHolder能够实现item多元化的功能

1.LinearRecyclerView

首先建立两个Activity,RecyclerViewActivity和LinearRecyclerViewActivity,以及一个LinearAdapter.

在activity_linear_recycler_view布局文件中声明RecyclerView控件id为rv_main,在布局文件activity_recycler_view中创建一个Button控件,id为btn_linear

在LinearAdapter中

public class LinearAdapter extends RecyclerView.Adapter {

    private Context mContext;


    LinearAdapter(Context context){
        this.mContext = context;
    }

    //负责每个子项的布局
    @Override
    public LinearAdapter.LinearViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        //LayoutInfluter是用于找res/layout/下的xml布局文件,并且实例化,作用类似于findViewById(),但是findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)
        //其中influte方法参数:
        //reSource:View的layout的ID
        //root:需要附加到resource资源文件的根控件,inflate()会返回一个View对象,如果第三个参数attachToRoot为true,就将这个root作为根对象返回,否则仅仅将这个root对象的LayoutParams属性附加到resource对象的根布局对象上,也就是布局文件resource的最外层的View上。如果root为null则会忽略view根对象的LayoutParams属性(注意)。
        //attachToRoot:是否将root附加到布局文件的根视图上
        return new LinearViewHolder(LayoutInflater.from(mContext).inflate(R.layout.layout_linear_item, parent, false));
    }

    //负责将每个子项holder绑定数据
    @Override
    public void onBindViewHolder(LinearAdapter.LinearViewHolder holder, int position) {
        holder.textView.setText("Hello World!");
    }

    @Override
    public int getItemCount() {
        return 30;
    }

    class LinearViewHolder extends RecyclerView.ViewHolder{

        private TextView textView;

        public LinearViewHolder(View itemView){
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.tv_title);
        }

    }
}

在LinearRecyclerViewActivity中

public class LinearRecyclerViewActivity extends AppCompatActivity {

    private RecyclerView mRvMain;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_linear_recycler_view);

        mRvMain = (RecyclerView) findViewById(R.id.rv_main);
        mRvMain.setLayoutManager(new LinearLayoutManager(LinearRecyclerViewActivity.this));
        mRvMain.setAdapter(new LinearAdapter(LinearRecyclerViewActivity.this));
    }
}

LinearLayoutManager是线性布局管理器,还有GridLayoutManager网格布局管理器

效果如下:Android学习笔记(四)-----RecyclerView,WebView_第1张图片

1.分割线的使用

可以在使用RecyclerView里的方法 addItemDecoration,但是该方法不是专门用来实现分割线的

使用如下:

mRvMain.addItemDecoration(new MyDecoration());


class MyDecoration extends RecyclerView.ItemDecoration{
        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
            super.getItemOffsets(outRect, view, parent, state);
            outRect.set(0, 0, 0, getResources().getDimensionPixelOffset(R.dimen.dividerHeight));
        }
}

其中ItemDecoration是一个抽象类用来装饰RecyclerView的子item的,ItemDecoration有以下方法:

  • getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) 设置四边边距,绘制周边内容
  • onDraw(Canvas c, RecyclerView parent, State state) 绘制装饰, 此方法绘制的任何内容都将在绘制项目视图之前绘制,因此将显示在视图下方。类似绘制背景
  • onDrawOver(Canvas c, RecyclerView parent, State state) 绘制蒙层,绘制项目视图后再绘制此方法绘制的内容,因此将显示在视图上。

OutRect.Set方法是设置矩形的坐标,指的是以四边为原点计算的坐标,因此可用来设置边距

2.点击事件

同普通的点击事件一样,可以利用回调自定义点击事件,

在Adapter中

@Override
    public void onBindViewHolder(GridAdapter.LinearViewHolder holder, final int position) {
        holder.textView.setText("Hello!");
        holder.itemView.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                mlistener.onClick(position);
            }
        });
    }
public interface OnItemClickListener{
        void onClick(int pos);
}

然后在Activity中

mRvGrid.setAdapter(new GridAdapter(GridRecyclerViewActivity.this, new GridAdapter.OnItemClickListener() {
            @Override
            public void onClick(int pos) {
                Toast.makeText(GridRecyclerViewActivity.this, "click:" + pos, Toast.LENGTH_SHORT).show();
            }
        }));

2.HorizontalRecyclerView,GridRecyclerView,StaggeredRecyclerView(瀑布流)

同LinearRecyclerView一样

3.在LinearRecyclerView中使用不同的ViewHolder

比如在position为偶数时使用一个ViewHolder,奇数时使用另一个ViewHolder

public int getItemViewType(int position) {
        if(position % 2 == 0){
            return 0;
        }else {
            return 1;
        }
    }

然后根据getItemViewType返回值来使用不同ViewHolder

if(viewType == 0){
            return new LinearViewHolder(LayoutInflater.from(mContext).inflate(R.layout.layout_linear_item, parent, false));
        }else {
            return new LinearViewHolder2(LayoutInflater.from(mContext).inflate(R.layout.layout_linear_item2, parent, false));
        }

效果如下:

Android学习笔记(四)-----RecyclerView,WebView_第2张图片

(2-12) WebView

Android学习笔记(四)-----RecyclerView,WebView_第3张图片

1.加载URL:

创建WebViewActivity以及布局文件activity_web_view.xml,在布局文件里添加控件

1.加载本地URL(assets下的html文件):webView.loadUrl("file:///android_asset/.....");

2.加载网络URL:webView.loadUrl("http://.....");

3.加载html代码:webView.loadData();   或   webView.loadDataWithBaseURL(); 

如果加载的网页有JavaScript代码,则需要开启使用

mWvMain.getSettings().setJavaScriptEnabled(true);

网页的前进后退:

  • webView.canGoBack()   是否能够返回
  • webView.goBack()   返回网页
  • webView.canGoForward   是否能过前进
  • webView.goForward  前进网页
  • webView.canGoBackOrForward(int steps)  是否可以前进或后退几步,负数值表示后退
  • webView.goGoBackOrForward(int steps)  前进或后退几步

按下返回键。默认是退出当前Activity,如果要页面内后退

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode == KeyEvent.KEYCODE_BACK && mWvMain.canGoBack()){
        mWvMain.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

setWebChromeClient主要处理解析,渲染网页等浏览器做的事情

WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等 

可以自己创建子类继承WebChromeClient实现部分方法:

如该方法用于设置标题

@Override
        public void onReceivedTitle(WebView view, String title) {
            super.onReceivedTitle(view, title);
            setTitle(title);
        }
public void onProgressChanged(WebView view, int newProgress) //加载进度变化条

WebViewClient就是帮助WebView处理各种通知、请求事件的

也可以自己创建子类继承WebViewClient实现部分方法:‘

该方法是不去调用本地浏览器,直接在当前应用加载网页

@Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            view.loadUrl(request.getUrl().toString());
            return true;
        }
public void onPageStarted(WebView view, String url, Bitmap favicon)//页面加载开始时
public void onPageFinished(WebView view, String url)//页面加载结束时

还可以通过evaluateJavascript ()调用JS代码

你可能感兴趣的:(学习,Android)