首先第一步我们要使用RecyclerView就得导包
千万不能导错
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recycler_main"/>
然后就是界面的java代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private RecyclerView recyclerView;
private List<UserBean> data;
private ListViewAdapter adapter;
private Button btn_list,btn_stagger,btn_grid;
private Button btn_addData,btn_deleteData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化
btn_grid=(Button)findViewById(R.id.btn_grid);
btn_list=(Button)findViewById(R.id.btn_list);
btn_stagger=(Button)findViewById(R.id.btn_stagger);
btn_addData=(Button)findViewById(R.id.addData);
btn_deleteData=(Button)findViewById(R.id.deleteData);
//设置点击功能
btn_list.setOnClickListener(this);
btn_grid.setOnClickListener(this);
btn_stagger.setOnClickListener(this);
btn_addData.setOnClickListener(this);
btn_deleteData.setOnClickListener(this);
//为集合填充数据
recyclerView=(RecyclerView)findViewById(R.id.recycler_main);
data=new ArrayList<UserBean>();
inData();
//初始化适配器
adapter=new ListViewAdapter(MainActivity.this,data);
//设置适配器
recyclerView.setAdapter(adapter);
//设置边界,就每一个条目之间都有竖直方向的边界,也就是下底的边界
recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
//设置监听。本身是没有这个方法。是自己在适配器内里面自己定义的
adapter.setOnItemClickListener(new ListViewAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, UserBean data) {
Toast.makeText(MainActivity.this, "data"+data.getData(), Toast.LENGTH_SHORT).show();
}
});
}
//为集合填充数据
private void inData() {
for(int i=0;i< Data.icons.length;i++){
UserBean userBean=new UserBean();
userBean.setImagePath(Data.icons[i]);
userBean.setData("信息:"+i);
data.add(userBean);
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_list:
//我们平时用的是第二个构造方法:有三个参数的。
//第一个参数是上下文,第二个是方向,第三个是倒叙还是正序。下面的自己理解
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
recyclerView.setAdapter(adapter);
break;
case R.id.btn_grid:
recyclerView.setLayoutManager(new GridLayoutManager(this, 2, GridLayoutManager.HORIZONTAL, false));
recyclerView.setAdapter(adapter);
break;
case R.id.btn_stagger:
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL));
recyclerView.setAdapter(adapter);
break;
case R.id.addData:
adapter.addData(0,new UserBean());
//跟踪0号位置条目
recyclerView.scrollToPosition(0);
break;
case R.id.deleteData:
adapter.removeData(0);
recyclerView.scrollToPosition(0);
break;
}
}
}
设配器代码:
public class ListViewAdapter extends RecyclerView.Adapter<ListViewAdapter.MyViewHodler> {
private List<UserBean> data;
private Context context;
//构造函数,将activity和数据传过来
public ListViewAdapter(Context context, List<UserBean> list) {
this.context=context;
this.data=list;
}
/**
* 相当于getView方法中创建View和VIewHolder
* @param parent
* @param viewType
* @return
*/
@NonNull
@Override
public ListViewAdapter.MyViewHodler onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view=View.inflate(context, R.layout.item_list, null);
return new MyViewHodler(view);
}
/**相当于getView绑定数据部分的代码
* 数据和View绑定
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(@NonNull ListViewAdapter.MyViewHodler holder, int position) {
//绑定数据之前,是要根据位置得到对应的数据
UserBean userBean = data.get(position);
//设置标题
String data = userBean.getData();
holder.tv_item.setText(data);
//设置图片路径且设置图片。
int imagePath = userBean.getImagePath();
holder.iv_item.setImageResource(imagePath);
}
/**
* 得到总条数
* @return
*/
@Override
public int getItemCount() {
return data.size();
}
//添加数据
public void addData(int position, UserBean userBean) {
userBean.setImagePath(R.drawable.ic_launcher_foreground);
userBean.setData("信息"+data.size());
data.add(position,userBean);
//刷新设配器
notifyItemInserted(position);
}
//删除条目
public void removeData(int position) {
data.remove(position);
//刷新适配器
notifyItemRemoved(position);
}
public class MyViewHodler extends RecyclerView.ViewHolder {
private ImageView iv_item;
private TextView tv_item;
public MyViewHodler(@NonNull View itemView) {
super(itemView);
iv_item=itemView.findViewById(R.id.iv_item);
tv_item=itemView.findViewById(R.id.tv_item);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//判断是否调用这个方法
if(onItemClickListener!=null){
onItemClickListener.onItemClick(v, data.get(getLayoutPosition()));
}
}
});
}
}
//----------定义点击监听接口----------------//
/**
* 当RecyclerView某个被点击的时候回调
* view:点击item的视图
* data:点击得到的数据
*/
public interface OnItemClickListener{
void onItemClick(View view , UserBean data);
}
private OnItemClickListener onItemClickListener;
//设置RecyclerView某条的监听
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
}
这里自定义接口的理解:也就是说:当我们在要设置监听时,首先调用的是set…方法,里面就需要传递个参数,也就是接口的。所以在调用set时,监听接口就不为null了。所以在我们点击某个条目时,就可以传递真实的参数过去。(太难讲述了,也太难理解了,简单来说就是interface是一个回调接口)