RecyclerView提供了三种布局管理器即:
- LinearLayoutManager 线性布局管理器
- StaggeredGridLayoutManager 瀑布流布局管理器
- GridLayoutManager 网格布局管理器
1.LinearLayoutManager 线性布局管理器
效果如图:
1).新建一个类存放信息。
public class News {
public String title; // 标题
public String content; //内容
}
2).新建一个xml文件,确定列表的布局。
3).在MainActivity中:
public class MainActivity extends AppCompatActivity {
RecyclerView mRecyclerView;
MyAdapter mMyAdapter ;
List<News> mNewsList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = findViewById(R.id.recyclerview);
// 构造一些数据
for (int i = 0; i < 50; i++) {
News news = new News();
news.title = "标题" + i;
news.content = "内容" + i;
mNewsList.add(news);
}
mMyAdapter = new MyAdapter();
mRecyclerView.setAdapter(mMyAdapter);
LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
// layoutManager.setOrientation(RecyclerView.HORIZONTAL); //设置横向滚动
mRecyclerView.setLayoutManager(layoutManager);
}
class MyAdapter extends RecyclerView.Adapter<MyViewHoder> {
@NonNull
@Override
public MyViewHoder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = View.inflate(MainActivity.this, R.layout.item_list, null);
MyViewHoder myViewHoder = new MyViewHoder(view);
return myViewHoder;
}
@Override
public void onBindViewHolder(@NonNull MyViewHoder holder, int position) {
News news = mNewsList.get(position);
holder.mTitleTv.setText(news.title);
holder.mTitleContent.setText(news.content);
}
@Override
public int getItemCount() {
return mNewsList.size();
}
}
class MyViewHoder extends RecyclerView.ViewHolder {
TextView mTitleTv;
TextView mTitleContent;
public MyViewHoder(@NonNull View itemView) {
super(itemView);
mTitleTv = itemView.findViewById(R.id.textView);
mTitleContent = itemView.findViewById(R.id.textView2);
}
}
4).横向滚动
添加以下代码:
layoutManager.setOrientation(RecyclerView.HORIZONTAL);
LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
layoutManager.setOrientation(RecyclerView.HORIZONTAL);
mRecyclerView.setLayoutManager(layoutManager);
2.网格布局
如果让一行显示多个,可以设置 GridLayoutManager
网格布局管理器来实现。
GridLayoutManager layoutManager = new GridLayoutManager(MainActivity.this,3);
// layoutManager.setOrientation(RecyclerView.HORIZONTAL); 也能设置横向滚动
mRecyclerView.setLayoutManager(layoutManager);
3.ItemDecoration
通过给 设置ItemDecoration 来装饰Item的效果,比如要设置间隔线
有两个可选参数VERTICAL和HORIZONTAL。
DividerItemDecoration mDivider = new
DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
mRecyclerView.addItemDecoration(mDivider);
HORIZONTAL
VERTICAL HORIZONTAL
4.实现动画效果DefaultItemAnimator
//实现点击监听器接口
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
}
按键初始化
///******************Item 动画**********************/
DefaultItemAnimator itemAnimator = new DefaultItemAnimator();
itemAnimator.setAddDuration(1000); //添加item渐入时间
itemAnimator.setRemoveDuration(1000); //删除item渐出时间
mRecyclerView.setItemAnimator(itemAnimator);
在MainAcitivity中添加两个按键,并使用onClick方法进行item的添加和删除
/****************添加item,删除item******************/
public void onClick(View v){
switch (v.getId()){
case R.id.btn_add:
News news = new News();
news.title = "标题 新内容";
news.content = "内容 新内容";
mNewsList.add(1,news);
mMyAdapter.notifyItemInserted(1);
mMyAdapter.notifyDataSetChanged(); //刷新数据
break;
case R.id.btn_remove:
try {
mNewsList.remove(1);
mMyAdapter.notifyItemMoved(0,1);
mMyAdapter.notifyDataSetChanged();
}catch (Exception e){
Toast.makeText(MainActivity.this,"列表已空。",Toast.LENGTH_LONG).show();
}
break;
default:
break;
}
}
此处存在的bug如下:
1.点击remove之后,add无法再次使用,有log出现,但无法再次添加新的item。
解决方法:使用
notifyDataSetChanged()
mMyAdapter.notifyDataSetChanged(); //刷新数据通常在列表中添加、删除或者是修改数据,notifyDataSetChanged()可以在适配器绑定的数组后,不用重新刷新Activity,通知Activity的适配器更新列表的数据即可。常用的列表指的是listview、recycleview。
必须要强调的就是notifyDataSetChanged必须是列表和适配器都初始化好了之后。
notifyDataSetChanged()会记住你划到的位置,重新加载数据的时候不会改变位置,只是改变了数据;而用notifyDataSetInvalidated()时,数据改变的同时,自动滑到顶部第0条的位置.
2.数据刷新后,添加删除正常使用,但最后一条item删除后APP直接闪退文章来源:https://www.toymoban.com/news/detail-771168.html
解决方法:使用try-catch文章来源地址https://www.toymoban.com/news/detail-771168.html
到了这里,关于Android的UI开发——RecyclerView的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!