Android工程搭建
Recyclerview
RecyclerView比ListView的优势:
1.RecyclerView比listview实现效果更多
2.RecycelrView支持多布局;
3.RecyclerView根据项目需要插拔功能
RecyclerView默认不支持点击事件->需代码中通过回调接口的方式添加监听
Recyclerview的三种布局
线性/网格/瀑布流
1、Recyclerview重要的方法
1.RecyclerView横向滑动:
LinearLayoutManager.HORIZONTAL横向滑动LinearLayoutManager.VERTICAL垂直滑动
2.RecyclerView.Adapter中刷新方法区别:
notifyDataSetChanged();整体刷新+没有动画效果
notifyItemInserted(int position,Object data):有动画效果+添加一条数据在position位置
notifyItemRemoved(position);有动画效果+删除一条数据并刷新
注意:当添加和删除的时候,要更新下标,不然有错位现象
3.RecyclerView多布局展示:
public int getItemViewType(int position)返回当前数据的itemview类型
4.RecyclerView常见方法:
LinearLayoutManager:recyclerview线性管理器(垂直水平方向);
GridLayoutManager:网格布局管理器;
StaggeredGridLayoutManager:瀑布流布局管理器;
RecyclerView.setLayoutManager(LayoutManager manager):添加布局管理器
RecyclerView.addItemDecoration(ItemDecoration decoration):添加分割线
RecyclerView.setItemAnimator(ItemAnimator animator):添加动画方法
RecyclerView.setAdapter(Adapter adapter):添加适配器
2、RecyclerView依赖
implementation 'com.android.support:recyclerview-v7:28.0.0'
3、具体代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
</LinearLayout>
package com.example.day1;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.widget.LinearLayout;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements MyAdapter.MainItemClickLisener {
RecyclerView recyclerView;
MyAdapter myAdapter;
ArrayList<Student> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recyclerView);
list.add(new Student("a",R.mipmap.k4_1));
list.add(new Student("b",R.mipmap.k4_2));
list.add(new Student("c",R.mipmap.k4_3));
list.add(new Student("d",R.mipmap.k4_4));
list.add(new Student("e",R.mipmap.k4_5));
myAdapter = new MyAdapter(list,this);
//线性布局
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayout.VERTICAL);
//网格布局
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
//瀑布流布局:一般和图片结合使用,自适应图片的高度
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
//设置布局
recyclerView.setLayoutManager(staggeredGridLayoutManager);
//设置分割线
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
//添加分割线
recyclerView.addItemDecoration(dividerItemDecoration);
//设置动画
DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator();
defaultItemAnimator.setRemoveDuration(2000);//设置延迟2秒的删除效果
defaultItemAnimator.setAddDuration(2000);
//设置动画
recyclerView.setItemAnimator(defaultItemAnimator);
//设置点击事件
myAdapter.setOnItemClick(this);
//设置适配器
recyclerView.setAdapter(myAdapter);
}
@Override
public void ItemClick(int position) {
//删除数据
list.remove(position);
//具有动画效果+删除
myAdapter.notifyItemRemoved(position);
//产生删除错位现象----->重新整理item的下表
myAdapter.notifyItemRangeChanged(0,list.size());
}
}
package com.example.day1;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
ArrayList<Student> list;
MainActivity con;
public MyAdapter(ArrayList<Student> list, MainActivity con) {
this.list = list;
this.con = con;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(con).inflate(R.layout.layout, null);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int i) {
viewHolder.imageView.setImageResource(list.get(i).getPic());
viewHolder.textView.setText(list.get(i).getName());
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.ItemClick(i);
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
TextView textView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
this.imageView = itemView.findViewById(R.id.imageView);
this.textView = itemView.findViewById(R.id.textView);
int ran = (int)(Math.random()*200+200);
Log.d("xxx",ran+"");
ViewGroup.LayoutParams layoutParams = imageView.getLayoutParams();
layoutParams.height=ran;
imageView.setLayoutParams(layoutParams);
}
}
private MainItemClickLisener listener;
public void setOnItemClick(MainItemClickLisener listener){
this.listener = listener;
}
interface MainItemClickLisener{
public void ItemClick(int position);
}
}
4、手机联系人多布局
package com.example.day1_duo;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.provider.ContactsContract;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
ArrayList<User> list = new ArrayList<>();
RecyclerView recyclerView;
ListView listView;
String str = "";
MyAdap myAdap;
ArrayAdapter arrayAdapter;
LinearLayoutManager linearLayoutManager;
String titles[]=new String[]{"A","B","C","D","E","F","G","H","I","G","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recyclerView);
listView = findViewById(R.id.listView);
arrayAdapter = new ArrayAdapter(this,R.layout.support_simple_spinner_dropdown_item,titles);
listView.setAdapter(arrayAdapter);
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query(uri, null, null, null, "phonebook_label asc", null);
while(cursor.moveToNext()){
Log.d("xxx",list.size()+"");
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String key = cursor.getString(cursor.getColumnIndex("phonebook_label"));
User user;
if(!str.equals(key)){
str=key;
user = new User(name, number, key,0);
list.add(user);
User user1 = new User(name, number, key, 1);
list.add(user1);
}else{
user = new User(name, number, key,1);
list.add(user);
}
}
for (int i=0;i<list.size();i++){
Log.d("xxx",list.get(i).toString());
}
myAdap = new MyAdap(list,this);
linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setAdapter(myAdap);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String title = titles[position];
Log.d("zxh",title);
int num = 0;
for(int i=0;i<list.size();i++){
User user = list.get(i);
if(user.getKey().equals(title)){
num=i;
Log.d("zxh",user.getKey());
Log.d("zxh",num+"");
break;
}
}
Log.d("zxhn",num+"");
linearLayoutManager.scrollToPositionWithOffset(num,0);
}
});
}
}
package com.example.day1_duo;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
public class MyAdap extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
ArrayList<User> list = new ArrayList<>();
MainActivity con;
public MyAdap(ArrayList<User> list, MainActivity con) {
this.list = list;
this.con = con;
}
@Override
public int getItemViewType(int position) {
return list.get(position).getType();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
if(i==0){
View view = LayoutInflater.from(con).inflate(R.layout.layout_title, viewGroup,false);
return new TitleHolder(view);
}else{
View view = LayoutInflater.from(con).inflate(R.layout.layout_phone, viewGroup,false);
return new PhoneHolder(view);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
if(getItemViewType(i)==0){
TitleHolder titleHolder = (TitleHolder) viewHolder;
titleHolder.text_title.setText(list.get(i).getKey());
}else{
PhoneHolder phoneHolder = (PhoneHolder) viewHolder;
phoneHolder.text_name.setText(list.get(i).getName());
phoneHolder.text_number.setText(list.get(i).getNumber());
}
}
@Override
public int getItemCount() {
return list.size();
}
class TitleHolder extends RecyclerView.ViewHolder{
TextView text_title;
public TitleHolder(@NonNull View itemView) {
super(itemView);
text_title = itemView.findViewById(R.id.text_title);
}
}
class PhoneHolder extends RecyclerView.ViewHolder{
TextView text_name,text_number;
public PhoneHolder(@NonNull View itemView) {
super(itemView);
text_name = itemView.findViewById(R.id.text_name);
text_number = itemView.findViewById(R.id.text_number);
}
}
}