RecyclerView
RecyclerView布局依赖:implementation 'com.android.support:recyclerview-v7:28.0.0’
RecyclerView比ListView的优势
- RecyclerView比listview实现效果更多
- RecycelrView支持多布局;
- RecyclerView根据项目需要插拔功能
RecyclerView默认不支持点击事件 需要通过回调接口的方式添加监听
RecyclerView方法
-
RecyclerView横向滑动:
LinearLayoutManager.HORIZONTAL横向滑动LinearLayoutManager.VERTICAL垂直滑动 -
RecyclerView.Adapter中刷新方法区别:
notifyDataSetChanged();整体刷新+没有动画效果
notifyItemInserted(int position,Object data):有动画效果+添加一条数据在position位置
notifyItemRemoved(position);有动画效果+删除一条数据并刷新 -
RecyclerView多布局展示:
public int getItemViewType(int position)返回当前数据的itemview类型 -
RecyclerView常见方法:
LinearLayoutManager:recyclerview线性管理器(垂直水平方向);
GridLayoutManager:网格布局管理器;
StaggeredGridLayoutManager:瀑布流布局管理器;
RecyclerView.setLayoutManager(LayoutManager manager):添加布局管理器
RecyclerView.addItemDecoration(ItemDecoration decoration):添加分割线
RecyclerView.setItemAnimator(ItemAnimator animator):添加动画方法
RecyclerView.setAdapter(Adapter adapter):添加适配器
RecyclerView代码实现
xml文件中创建该布局
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rv">
</android.support.v7.widget.RecyclerView>
RecyclerView recyclerView;
String url = "https://www.apiopen.top/satinApi?type=1&page=2";
MyRecylerViewAdapter myRecylerViewAdapter;
ArrayList<HashMap<String,String>> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.rv);
OkGo.<String>get(url).execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
String s = response.body();
Gson gson = new Gson();
JavaBean javaBean = gson.fromJson(s, JavaBean.class);
List<JavaBean.DataBean> data = javaBean.getData();
for (int i=0;i<data.size();i++) {
HashMap<String,String> map = new HashMap<>();
JavaBean.DataBean dataBean = data.get(i);
String videouri = dataBean.getVideouri();
String text = dataBean.getText();
String image0 = dataBean.getImage0();
map.put("videouri",videouri);
map.put("image0",image0);
map.put("text",text);
list.add(map);
}
myRecylerViewAdapter = new MyRecylerViewAdapter(list,MainActivity.this);
recyclerView.setAdapter(myRecylerViewAdapter);
myRecylerViewAdapter.setMyInterface(new MyInterface() {
@Override
public void OnClickListenner(int porsition) {
HashMap<String, String> map = list.get(porsition);
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
intent.putExtra("path",map.get("videouri"));
startActivity(intent);
}
@Override
public void OnLongClickListenner(int porsition) {
list.remove(porsition);
myRecylerViewAdapter.notifyItemRangeChanged(0,list.size());
}
});
}
});
// 删除动画效果
DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator();
defaultItemAnimator.setRemoveDuration(2000);
// LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
// GridLayoutManager gridLayoutManager = new GridLayoutManager(this,2);
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
}
删除动画错位
删除的同时将位置从头开始
list.remove(porsition);
myRecylerViewAdapter.notifyItemRangeChanged(0,list.size());
接口回调
- 先创建接口
public interface MyInterface {
void OnClickListenner(int porsition);
void OnLongClickListenner(int porsition);
}
- 适配器中需要回调方法
myRecylerViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myInterface.OnClickListenner(i);
}
});
myRecylerViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
myInterface.OnLongClickListenner(i);
return true;
}
});
- 去完成返回来的方法去实现功能
myRecylerViewAdapter.setMyInterface(new MyInterface() {
@Override
public void OnClickListenner(int porsition) {
HashMap<String, String> map = list.get(porsition);
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
intent.putExtra("path",map.get("videouri"));
startActivity(intent);
}
@Override
public void OnLongClickListenner(int porsition) {
list.remove(porsition);
myRecylerViewAdapter.notifyItemRangeChanged(0,list.size());
}
});
多布局
主要在适配器中创建多个ViewHolder类,有几个布局就创建几个
public class MyRecylerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
ArrayList<JavaBean> list;
Context context;
public MyRecylerViewAdapter(ArrayList<JavaBean> list, Context context) {
this.list = list;
this.context = context;
}
@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(context).inflate(R.layout.title_layout, viewGroup, false);
return new TitleViewHolder(view);
}else {
View view = LayoutInflater.from(context).inflate(R.layout.person_layout,viewGroup,false);
return new PersonViewHolder(view);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
if (getItemViewType(i)==0) {
TitleViewHolder titleViewHolder = (TitleViewHolder) viewHolder;
titleViewHolder.textView.setText(list.get(i).getTitle()+"");
}else {
PersonViewHolder personViewHolder = (PersonViewHolder) viewHolder;
personViewHolder.tv_name.setText(list.get(i).getName()+"");
personViewHolder.tv_number.setText(list.get(i).getNumber()+"");
}
}
@Override
public int getItemCount() {
return list.size();
}
class TitleViewHolder extends RecyclerView.ViewHolder{
TextView textView;
public TitleViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.tv);
}
}
class PersonViewHolder extends RecyclerView.ViewHolder{
TextView tv_name,tv_number;
public PersonViewHolder(@NonNull View itemView) {
super(itemView);
tv_name = itemView.findViewById(R.id.tv_name);
tv_number = itemView.findViewById(R.id.tv_number);
}
}
}