Recyclerview
一 简介:
Recyclerview是谷歌公司推出了一个用于大量数据展示的新控件,用于替代listview,给用户带来极大的方便性与灵活性。
二 使用方法:
1.导入Recyclerview依赖( implementation 'com.android.support:recyclerview-v7:28.0.0')
2.编写布局以及itemView布局
main.xml
<android.support.v7.widget.RecyclerView android:layout_height="match_parent" android:layout_width="match_parent" android:id="@+id/review"/>
itemView布局
<ImageView android:layout_height="150dp" android:layout_width="150dp" android:sr`在这里插入代码片`c="@mipmap/ic_launcher" android:id="@+id/img_iv"/>
<LinearLayout android:layout_height="80dp" android:layout_width="150dp" android:layout_alignBottom="@+id/img_iv" android:orientation="vertical" android:alpha="0.5" android:background="#000">
<TextView android:layout_height="50dp" android:layout_width="match_parent" android:id="@+id/text01"/>
<TextView android:layout_height="50dp" android:layout_width="match_parent" android:id="@+id/text02"/>
</LinearLayout>
3.生成RecyclerView数据源(生成Bean类略)
public class Mysynctask extends AsyncTask<String,Void,String>{
String str = "http://mrobot.pcauto.com.cn/v2/cms/channels/3?pageNo=1&pageSize=20&v=4.0.0";
StringBuffer sbf = new StringBuffer();
List<Bean.DataBean> data;
private Myadapter myadapter;
private RecyclerView recyclerView;
public Mysynctask(String str,List<Bean.DataBean> data, Myadapter myadapter, RecyclerView recyclerView) {
this.str = str;
this.data = data;
this.myadapter = myadapter;
this.recyclerView = recyclerView;
}
@Override
protected String doInBackground(String... strings) {
try {
URL url = new URL(str);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(1000*30);
con.setReadTimeout(1000*60);
con.setRequestMethod("GET");
if(con.getResponseCode() == 200) {
InputStream is = con.getInputStream();
byte[] bys = new byte[1024];
int len = 0;
while((len = is.read(bys))!=-1) {
sbf.append(new String(bys,0,len));
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sbf.toString();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Gson gson = new Gson();
Bean bean = gson.fromJson(s, Bean.class);
data = bean.getData();
myadapter = new Myadapter();
recyclerView.setAdapter(myadapter);
myadapter.refresh(data);
}
}
4.编写RecyclerView适配器
public class Myadapter extends RecyclerView.Adapter<Myadapter.ViewHolder>{
List<Bean.DataBean> data = new ArrayList<>();
private Context context;
public void refresh(List<Bean.DataBean> data){
this.data.addAll(data);
notifyDataSetChanged();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
context = viewGroup.getContext();
View view = LayoutInflater.from(context).inflate(R.layout.item_layout, viewGroup, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
viewHolder.textView01.setText(data.get(i).getTitle());
viewHolder.textView02.setText(data.get(i).getId());
//viewHolder.img.setImageBitmap(BitmapFactory.decodeFile(data.get(i).getImage()));
Picasso.with(context).load(data.get(i).getImage()).into(viewHolder.img);
}
@Override
public int getItemCount() {
return data.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
ImageView img;
TextView textView01,textView02;
public ViewHolder(@NonNull View itemView) {
super(itemView);
img = itemView.findViewById(R.id.img_iv);
textView01 = itemView.findViewById(R.id.text01);
textView02 = itemView.findViewById(R.id.text02);
}
}
}
5.设置item点击事件
public class MainActivity extends AppCompatActivity {
private RecyclerView review;
private Myadapter myadapter;
private List<Bean.DataBean> data;
String s = "http://mrobot.pcauto.com.cn/v2/cms/channels/3?pageNo=1&pageSize=20&v=4.0.0";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
review = (RecyclerView) findViewById(R.id.review);
StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
manager.setOrientation(LinearLayoutManager.VERTICAL);
review.setLayoutManager(manager);
myadapter = new Myadapter();
new Mysynctask(s,data,myadapter,review).execute();
}
}
三 常见方法:
LinearLayoutManager:recyclerview线性管理器(vertical和horizontal)(默认垂直(vertical)
GridLayoutManager:网格布局管理器;
StaggeredGridLayoutManager:瀑布流布局管理器;
RecyclerView.setLayoutManager(LayoutManager manager):添加布局管理器
RecyclerView.addItemDecoration(ItemDecoration decoration):添加分割线
RecyclerView.setItemAnimator(ItemAnimator animator):添加动画方法
RecyclerView.setAdapter(Adapter adapter):添加适配器
ToolBar与DrawerLayout使用
ToolBar使用:
- xml中使用<android.support.v7.widget.Toolbar/>声明
Toolbar;
2.设置toolbar的基本属性;
3.Activity中进行相关设置。
ToolBar基本方法:1.supportRequestWindowFeature(Window.FEATURE_NO_TITLE);去掉标题栏;
-
2.Toolbar.setLogo(),设置logo图片;
-
3.Toolbar.setTitle().设置标题;
-
4.Toolbar.setSubTitle()设置子标题;
-
5.Toolbar.setTitleTextColor(int color);设置标题文字颜色;
-
6.Toolbar.setSubtitleTextColor();设置子标题文字颜色;
-
7.setTitleMargin(int start, int top, int end, int bottom);设置标题margin值; 8.onCreateOptionsMenu,getMenuInflater().inflate(R.menu.menu,menu)
-
设置菜单在给Toolbar设置为actionbar时使用;
-
9.Toolbar.setOnMenuItemClickListener();Toolbar绑定menu监听;
-
10.Toolbar.inflateMenu(R.menu.menu)在Toolbar没有替换actionbar时使用;
-
11.setSupportActionBar(mToolbar);设置toolbar替换actionbar;
-
12.getLayoutInflater().inflate(R.layout.view_tv,bar);Toolbar添加自定义view
-
13.Menu下的showAsAction属性:alaways:这个值会使菜单项一直显示在ActionBar上,ifRoom:如果有足够的空间,这个值会使菜单显示在ActionBar上,never:这个值菜单永远不会出现在ActionBar上,withText:这个值使菜单和它的图标,菜单文本一起显示
DrawerLayout基本方法:
1.Drawerlayout.setDrawerLockMode()设置Drawerlayout模式:DrawerLayout.LOCK_MODE_LOCKED_CLOSED关闭手势,LOCK_MODE_UNLOCKED开启手势;
2.DrawerLayout.isDrawerOpen(Gravity.LEFT)是否开启;
3.DrawerLayout.openDrawer(Gravity.LEFT);开启抽屉
4.DrawerLayout.closeDrawer(Gravity.RIGHT);关闭抽屉
代码如下:
package com.huluobo.lc.a1609a_designdemo;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TabLayout;
import android.support.design.widget.TextInputLayout;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private NavigationView navigationView;
private DrawerLayout drawerLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contant);
//NavigationView
drawerLayout = findViewById(R.id.drawerLayout);
navigationView = findViewById(R.id.navigationview);
setupDrawerContent(navigationView);
}
private void setupDrawerContent(NavigationView navigationView) {
navigationView.setNavigationItemSelectedListener(new NavigationView
.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
menuItem.setCheckable(true);
drawerLayout.closeDrawers();//设置左方抽屉关闭
Snackbar.make(ll, "id:" + menuItem.getTitle(), Snackbar.LENGTH_INDEFINITE).show();
return true;
}
});
}
}
SurfaceView简介:
1.如果需要在另外的线程绘制界面、需要迅速的更新界面,或者渲染UI界面 需要较长的时间,这种情况就要使用SurfaceView了。SurfaceView中包含一个Surface对象,而Surface是可以在后台线程中绘制的。
SurfaceView生命周期:
surfaceCreated 当SurfaceHolder被创建的时候回调
surfaceChanged当SurfaceHolder的尺寸发生变化的时候被回调
surfaceDestroyed 当SurfaceHolder被销毁的时候回调
SurfaceView与View区别:
View 主要适用于主动更新的情况,而 surfaceView 主要适用于被动更新,
例如频繁的刷新。
View 在主线程中对画面进行刷新,而 surfaceView 通常会通过一个子线程
来进行页面的刷新
View 在绘图时没有使用双缓冲机制,而 surfaceView 在底层实现机制上就
已经实现了双缓冲机制
SurfaceView常用方法:
getHolder():获取surfaceholder对象
Paint.ANTI_ALIAS_FLAG:抗锯齿
Paint.setColor(int color):设置颜色
Paint.setStrokeWidth(int p):设置描边宽度
Canvas.drawColor(Color color):画布绘制颜色
Canvas.drawLine(float startX, float startY, float stopX, float stopY,
@NonNull Paint paint)
方法 |
作用 |
备注 |
moveTo |
移动起点 |
移动下一次操作的起点位置 |
lineTo |
连接直线 |
连接上一个点到当前点之间的直线 |
setLastPoint |
设置终点 |
重置最后一个点的位置 |
close |
闭合路劲 |
从最后一个点连接最初的一个点,形成一个闭合区域 |
addRect |
添加矩形 |
添加矩形到当前Path |
addRoundRect |
添加圆角矩形 |
添加圆角矩形到当前Path |
addOval |
添加椭圆 |
添加椭圆到当前Path |
addCircle |
添加圆 |
添加圆到当前Path |
addPah |
添加路劲 |
添加路劲到当前Path |
addArc |
添加圆弧 |
添加圆弧到当前Path |
arcTo |
圆弧 |
绘制圆弧,注意和addArc的区别 |
isEmpty |
是否为空 |
判定Path是否为空 |
isRect |
是否为矩形 |
判定Path是否是一个矩形 |
set |
替换路劲 |
用新的路劲替换当前路劲的所有内容 |
offset |
偏移路劲 |
对当前的路劲进行偏移 |
quadTo |
贝塞尔曲线 |
二次贝塞尔曲线的方法 |
cubicTo |
贝塞尔曲线 |
三次贝塞尔曲线的方法 |
rMoveTo,rlineTo,rQuadTo,rCubicTo |
rXxx方法 |
不带r的方法是基于原点坐标系(偏移量),带r的基于当前点坐标系(偏移量) |
op |
布尔操作 |
对两个Path进行布尔运算(交集,并集)等操作 |
HTTP协议:
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。
HTTP协议会话方式:
1建立tcp连接
2发出请求文档
3发出响应文档
4释放tcp连接
HTTP1.0与1.1区别:
HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。
HTTP 1.1则支持持久连接Persistent Connection, 并且默认使用persistent connection. 在同一个tcp的连接中可以传送多个HTTP请求和响应. 多个请求和响应可以重叠,多个请求和响应可以同时进行. 更加多的请求头和响应头(比如HTTP1.0没有host的字段).
HTTP请求行与请求内容:
HTTP 7种请求方式:
1、opions返回服务器针对特定资源所支持的HTML请求方法或web服务器发送*测试服务器功能(允许客户端查看服务器性能)
2、Get向特定资源发出请求(请求指定页面信息,并返回实体主体)
3、Post向指定资源提交数据进行处理请求(提交表单、上传文件),又可能导致新的资源的建立或原有资源的修改
4、Put向指定资源位置上上传其最新内容(从客户端向服务器传送的数据取代指定文档的内容)
5、Head与服务器索与get请求一致的相应,响应体不会返回,获取包含在小消息头中的原信息(与get请求类似,返回的响应中没有具体内容,用于获取报头)
6、Delete请求服务器删除request-URL所标示的资源*(请求服务器删除页面)
7、Trace回显服务器收到的请求,用于测试和诊断
GET与POST区别(*****):
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。 post基本没有限制,上传文件,都是用post方式的。只不过要修改form里面的那个type参数对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。