一、 为RecyclerView的item添加监听事件
在对RecyclerView的item进行操作的时候会遇到点击事件和长按事件,但是在RecyclerView中没有直接的方法进行监听,需要我们在适配器里面对item进行监听,或者提供一个接口给RecyclerView调用,实现点击和长按的事件监听事件。在适配器里面对item进行监听实际上是对填充到列表项的view进行监听,实现的是setOnClickListener和setOnLongClickListener方法。
@NonNull
@Override
public CreateHolder onCreateViewHolder(@NonNull ViewGroup parent, final int viewType) {
View view = LayoutInflater.from (parent.getContext ()).inflate (R.layout.create_list_item_layout,parent,false);
final CreateHolder holder = new CreateHolder (view);
view.setOnLongClickListener (new View.OnLongClickListener () {
@Override
public boolean onLongClick(View view) {
return false;
}
});
view.setOnClickListener (new View.OnClickListener () {
@Override
public void onClick(View view) {
}
});
return holder;
}
二、 为RecyclerView添加滑动事件监听
RecyclerView在滑动的时候可以直接对滑动事件进行监听,可以直接在RecyclerView的对象调用addOnScrollListener接口,然后可以复写两个方法,onScrollStateChanged用来监听滑动状态的改变,
onScrolled用来监听滑动的动作。
mRecyclerView.addOnScrollListener (new RecyclerView.OnScrollListener () {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged (recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled (recyclerView, dx, dy);
}
});
三、 RecyclerView的预加载功能
RecyclerView在进行加载的时候由传入的数据决定加载的数量,如果传入的数量太多,在加载的时候会浪费许多内存,也会消耗大量的资源,加载也比较耗时。在对RecyclerView进行滑动监听的时候可以选择对item进行预加载,只显示每一次加载的item,在滑动到底部的时候进行下一次加载,添加到list里面,进行显示,这样就能实现一个预加载的功能。
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private RecyclerAdapter adapter;
private Boolean isLoadItem = false;
private LinearLayoutManager manager;
List<Item> list = ItemFactory.createItem(20);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initRecyclerView ();
}
public void initRecyclerView(){
mRecyclerView = findViewById(R.id.recycler_view);
adapter = new RecyclerAdapter(this,list);
//设置LayoutManager
manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
mRecyclerView.setLayoutManager(manager);
//设置动画效果
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//设置适配器
mRecyclerView.setAdapter(adapter);
//添加默认的分割线
mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
mRecyclerView.addOnScrollListener (new RecyclerView.OnScrollListener () {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged (recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled (recyclerView, dx, dy);
Log.d ("scroll",dx+" "+dy);
int lastItem = manager.findLastVisibleItemPosition ()+1;
int totalItem = manager.getItemCount ();
Toast.makeText (MainActivity.this,"last item is"+lastItem+"/"+totalItem,Toast.LENGTH_SHORT).show ();
if(lastItem+1 == totalItem){
if(isLoadItem){
Toast.makeText (MainActivity.this,"已经加载",Toast.LENGTH_SHORT).show ();
}else {
loadMore (20);
}
isLoadItem = !isLoadItem;
}
}
});
}
public void loadMore(int num){
for(int i=0;i<num;i++){
list.add (ItemFactory.createItem (20).get (i));
//更新列表
adapter.notifyDataSetChanged ();
}
}
}