其官方定义是: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 {
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,在布局文件里添加控件
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代码