当前位置:   article > 正文

Android学习笔记(四)-----RecyclerView,WebView_android 上半部分是webview 下半部分是recycleview

android 上半部分是webview 下半部分是recycleview

(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中

  1. public class LinearAdapter extends RecyclerView.Adapter<LinearAdapter.LinearViewHolder> {
  2. private Context mContext;
  3. LinearAdapter(Context context){
  4. this.mContext = context;
  5. }
  6. //负责每个子项的布局
  7. @Override
  8. public LinearAdapter.LinearViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  9. //LayoutInfluter是用于找res/layout/下的xml布局文件,并且实例化,作用类似于findViewById(),但是findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)
  10. //其中influte方法参数:
  11. //reSource:View的layout的ID
  12. //root:需要附加到resource资源文件的根控件,inflate()会返回一个View对象,如果第三个参数attachToRoot为true,就将这个root作为根对象返回,否则仅仅将这个root对象的LayoutParams属性附加到resource对象的根布局对象上,也就是布局文件resource的最外层的View上。如果root为null则会忽略view根对象的LayoutParams属性(注意)。
  13. //attachToRoot:是否将root附加到布局文件的根视图上
  14. return new LinearViewHolder(LayoutInflater.from(mContext).inflate(R.layout.layout_linear_item, parent, false));
  15. }
  16. //负责将每个子项holder绑定数据
  17. @Override
  18. public void onBindViewHolder(LinearAdapter.LinearViewHolder holder, int position) {
  19. holder.textView.setText("Hello World!");
  20. }
  21. @Override
  22. public int getItemCount() {
  23. return 30;
  24. }
  25. class LinearViewHolder extends RecyclerView.ViewHolder{
  26. private TextView textView;
  27. public LinearViewHolder(View itemView){
  28. super(itemView);
  29. textView = (TextView) itemView.findViewById(R.id.tv_title);
  30. }
  31. }
  32. }

在LinearRecyclerViewActivity中

  1. public class LinearRecyclerViewActivity extends AppCompatActivity {
  2. private RecyclerView mRvMain;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_linear_recycler_view);
  7. mRvMain = (RecyclerView) findViewById(R.id.rv_main);
  8. mRvMain.setLayoutManager(new LinearLayoutManager(LinearRecyclerViewActivity.this));
  9. mRvMain.setAdapter(new LinearAdapter(LinearRecyclerViewActivity.this));
  10. }
  11. }

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

效果如下:

1.分割线的使用

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

使用如下:

  1. mRvMain.addItemDecoration(new MyDecoration());
  2. class MyDecoration extends RecyclerView.ItemDecoration{
  3. @Override
  4. public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
  5. super.getItemOffsets(outRect, view, parent, state);
  6. outRect.set(0, 0, 0, getResources().getDimensionPixelOffset(R.dimen.dividerHeight));
  7. }
  8. }

其中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中

  1. @Override
  2. public void onBindViewHolder(GridAdapter.LinearViewHolder holder, final int position) {
  3. holder.textView.setText("Hello!");
  4. holder.itemView.setOnClickListener(new View.OnClickListener(){
  5. @Override
  6. public void onClick(View v) {
  7. mlistener.onClick(position);
  8. }
  9. });
  10. }
  11. public interface OnItemClickListener{
  12. void onClick(int pos);
  13. }

然后在Activity中

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

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

同LinearRecyclerView一样

3.在LinearRecyclerView中使用不同的ViewHolder

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

  1. public int getItemViewType(int position) {
  2. if(position % 2 == 0){
  3. return 0;
  4. }else {
  5. return 1;
  6. }
  7. }

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

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

效果如下:

(2-12) WebView

1.加载URL:

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

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,如果要页面内后退

  1. @Override
  2. public boolean onKeyDown(int keyCode, KeyEvent event) {
  3. if(keyCode == KeyEvent.KEYCODE_BACK && mWvMain.canGoBack()){
  4. mWvMain.goBack();
  5. return true;
  6. }
  7. return super.onKeyDown(keyCode, event);
  8. }

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

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

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

如该方法用于设置标题

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

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

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/286624
推荐阅读
相关标签
  

闽ICP备14008679号