赞
踩
其官方定义是:A flexible view for providing a limited window into a large data set
能够灵活的实现大数据集的展示,视图的复用管理比ListView更好,能够显示列表,网格,瀑布流等形式,且不同的ViewHolder能够实现item多元化的功能
首先建立两个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<LinearAdapter.LinearViewHolder> {
-
- 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网格布局管理器
效果如下:
可以在使用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有以下方法:
OutRect.Set方法是设置矩形的坐标,指的是以四边为原点计算的坐标,因此可用来设置边距
同普通的点击事件一样,可以利用回调自定义点击事件,
在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();
- }
- }));
同LinearRecyclerView一样
比如在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));
- }
效果如下:
创建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,如果要页面内后退
- @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代码
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。