一 、 初始化recycleview
//赋值
listView = findViewById(R.id.list_view);
//设置布局
listView.setLayoutManager(new LinearLayoutManager(this));
ArrayList list = new ArrayList<HashMap<String, String>>();
for (int i = 0; i < 30; i++) {
HashMap<String, String> model = new HashMap();
model.put("name", "" + i);
model.put("desc", "" + (30 - i));
list.add(model);
}
recycleViewAdapter = new RecycleViewAdapter(list);
//设置adapter
listView.setAdapter(recycleViewAdapter);
//点击监听
recycleViewAdapter.setOnItemClickListener(new RecycleViewAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int postion) {
Toast.makeText(MainActivity.this, "" + postion, Toast.LENGTH_SHORT).show();
}
});
二、自定义adapter类
public class RecycleViewAdapter extends RecyclerView.Adapter <RecyclerView.ViewHolder> {
static final int Type_First_item = 11111;
static final int Type_Second_item = 22222;
//监听接口
private OnItemClickListener onItemClickListener;
//数据源
private List<HashMap<String, String>> list;
public RecycleViewAdapter(List<HashMap<String, String>> list){
this.list = list;
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
//定义监听接口
public interface OnItemClickListener {
public void onItemClick(View view, int postion);
}
public void setList(List<HashMap<String, String>> list) {
this.list = list;
}
/ /第一个item类型的viewholder
class FirstViewHolder extends RecyclerView.ViewHolder{
TextView nameView;
TextView descView;
public FirstViewHolder(@NonNull View itemView) {
super(itemView);
nameView = itemView.findViewById(R.id.name);
descView = itemView.findViewById(R.id.desc);
}
}
/ /第二个item类型的viewholder
class SecondViewHolder extends RecyclerView.ViewHolder{
TextView nameView;
TextView descView;
public SecondViewHolder(@NonNull View itemView) {
super(itemView);
nameView = itemView.findViewById(R.id.name);
descView = itemView.findViewById(R.id.desc);
}
}
//将xml反射为view 再和viewholder绑定
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
RecyclerView.ViewHolder holder;
View itemView;
if (i == Type_First_item){
itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycle_item, viewGroup, false);
holder = new FirstViewHolder(itemView);
}else {
itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycle_item2, viewGroup, false);
holder = new SecondViewHolder(itemView);
}
return holder;
}
//设置item数据
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
HashMap map = list.get(i);
String name = (String) map.getOrDefault("name", "");
String desc = (String) map.getOrDefault("desc", "");
if (viewHolder instanceof FirstViewHolder){
FirstViewHolder holder = (FirstViewHolder)viewHolder;
holder.nameView.setText(name);
holder.descView.setText(desc);
if (onItemClickListener != null){
holder.nameView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onItemClickListener.onItemClick(view, i);
}
});
}
}else {
SecondViewHolder holder = (SecondViewHolder)viewHolder;
holder.nameView.setText(name);
holder.descView.setText(desc);
if (onItemClickListener != null){
holder.nameView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onItemClickListener.onItemClick(view, i);
}
});
}
}
}
//返回item个数
@Override
public int getItemCount() {
return list.size();
}
// 多类型item情况下 需要重写该方法 ,根据位置设置不同的布局
@Override
public int getItemViewType(int position) {
if (position % 3 == 0){
return Type_First_item;
}else {
return Type_Second_item;
}
}
}
三、增加刷新
首先将SwipeRefreshLayout设置为RecyclerView的父view
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swiperefreshlayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/list_view"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.v4.widget.SwipeRefreshLayout>>
代码部分
准守SwipeRefreshLayout.OnRefreshListener协议
swiperefreshlayout.setOnRefreshListener(this);
//设置组件颜色
swiperefreshlayout.setColorSchemeResources(R.color.colorPrimary);
//设置组件出现的位置
swiperefreshlayout.setProgressViewOffset(true, 0, 50);
//刷新时调用的方法
public void onRefresh() {
}
四、添加分割线
1、xml中直接画
2、用系统的DividerItemDecoration
Drawable drawable = ContextCompat.getDrawable(this, R.drawable.line);
DividerItemDecoration line = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
line.setDrawable(drawable);
listView.addItemDecoration(line);
3、继承RecyclerView.ItemDecoration, 重写
//画线
public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) ;
//item的间隔
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) ;











网友评论