Android知识点 - RecyclerView的使用

RecyclerView的简单使用

同时包含知识点:CardView
框架:Glide

使用步骤

  1. 添加依赖包
  2. 主布局文件添加RecyclerView控件.(activity_main.xml)
  3. 创建子项布局文件.(practiced_item.xml)
  4. 创建一个类为子项填充对象(内容).(Practice.java)
  5. 为RecycleView创建一个适配器,简单说就是把第3步写子项加载到第2步写的RecycleView里。(PracticeAdapter .java)
  6. 在添加RecyclerView的Activity里调用.(MainActivity.java)

1、添加依赖包

implementation 'com.android.support:recyclerview-v7:28.0.0'

2、主布局文件添加RecyclerView控件(activity_main.xml)
添加behavior属性值“@string/appbar_scrolling_view_behavior”可以避免toolbar遮挡recyclerView。

<android.support.v7.widget.RecyclerView
        android:id="@+id/recycle_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
    </android.support.v7.widget.RecyclerView>

3、 创建子项布局文件(practiced_item.xml)
这里使用CardView,需添加依赖库 implementation ‘com.android.support:cardview-v7:28.0.0’

<android.support.v7.widget.CardView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="70dp"
    android:layout_marginTop="10dp"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:layout_marginBottom="10dp"
    app:cardCornerRadius="4dp"
    android:id="@+id/card_view">
    <RelativeLayout
        android:id="@+id/item_layout"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/item_text"
            android:layout_centerInParent="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16sp" />
    </RelativeLayout>
</android.support.v7.widget.CardView>

这样的卡片效果
4、创建一个类为子项填充对象(内容),这里添加Practice类(Practice.java)

public class Practice {
    private String name;
    private int id;

    public Practice(String name, int id) {
        this.name = name;
        this.id = id;
    }
    public String getName(){
        return name;
    }
    public int getId() {
        return id;
    }
}

5、为RecycleView创建一个适配器(PracticeAdapter .java),简单说就是把第3步写子项加载到第2步写的RecycleView里。

//1、继承RecyclerView.Adapter,并将泛型指为<PracticeAdapter.ViewHolder>,
//需要重构 onCreateViewHolder()、onBindViewHolder()、getItemCount()三个方法
public class PracticeAdapter extends RecyclerView.Adapter<PracticeAdapter.ViewHolder> {
    final int RETROFIT2 = 1;
    public Context mContext;
    public List<Practice> practiceList;
    //2、建一个ViewHolder对控件实例进行缓存,需继承RecyclerView.ViewHolder。
    static class ViewHolder extends RecyclerView.ViewHolder {
        CardView cardView;
        TextView practice_name_view;
        RelativeLayout relativeLayout;
        //参数view通常是RecycleView的子项的最外层布局
        public ViewHolder(View view) {
            super(view);
            cardView = (CardView) view;
            practice_name_view = view.findViewById(R.id.item_text);
            relativeLayout = view.findViewById(R.id.item_layout);
        }
    }

    public PracticeAdapter(List<Practice> practices) {
    //3、将需要添加的数据源传进来,给到全局变量
        this.practiceList = practices;
    }
    //4、重写onCreateViewHolder(),用于创建ViewHolder实例
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        if (mContext == null) {
            mContext = viewGroup.getContext();
        }
        //将子项布局文件动态加载进来
        View view = LayoutInflater.from(mContext).inflate(R.layout.practiced_item, viewGroup, false);
        final ViewHolder viewHolder = new ViewHolder(view);
        //对子项添加点击监听器
        viewHolder.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            //获取点击的位置
                int position = viewHolder.getAdapterPosition();
                //获取对应的对象
                Practice practice = practiceList.get(position);
                //自定义操作
                selectPractice(practice);
            }
        });
        //返回实例
        return viewHolder;
    }
//自定义操作
    private void selectPractice(Practice practice) {
        Intent intent;
        switch (practice.getId()) {
            case RETROFIT2:
               intent = new Intent(mContext, SearchCity.class);
               mContext.startActivity(intent);
               break;
            default:
                Toast.makeText(mContext, "Testing", Toast.LENGTH_SHORT).show();
                break;
        }
    }

    //5、重写 onBindViewHolder(),作用是对子项数据进行赋值,每个子项被滚动到屏幕内时执行
    @Override
    public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int position) {
        Practice practice = practiceList.get(position);
        viewHolder.practice_name_view.setText(practice.getName());
        //这里使用了Glide框架加载子项的背景图片,relativeLayout在子项布局里设置了
        SimpleTarget<Drawable> target = new SimpleTarget<Drawable>() {
            @Override
            public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
              //SimpleTarget<Drawable>()可以为RelativeLayout、LinearLayout等布局设置背景
                viewHolder.relativeLayout.setBackground(resource);
            }
        };
        //使用Glide需要添加依赖库 implementation 'com.github.bumptech.glide:glide:4.9.0'
        Glide.with(mContext).load(R.drawable.bg_item).into(target);
    }
//6、重写 getItemCount() ,返回子项的数量,一般返回数据源的长度即可
    @Override
    public int getItemCount() {
        return practiceList.size();
    }
}

6、在添加RecyclerView的Activity里调用(MainActivity.java)

		//初始化数据源
		public List<Practice> practiceList = new ArrayList<>();
		practiceList.add(new Practice("Retrofit2", 1));
		practiceList.add(new Practice("Test", 2));
	
		RecyclerView recyclerView = findViewById(R.id.recycle_view);
		//为recyclerView指定布局方式,GridLayout网格布局,(context,spanCount列数)
        GridLayoutManager layoutManager = new GridLayoutManager(this, 1);
        recyclerView.setLayoutManager(layoutManager);
        //设置适配器,把数据源传进去
        PracticeAdapter adapter = new PracticeAdapter(practiceList);
        recyclerView.setAdapter(adapter);

实现效果

效果图

猜你喜欢

转载自blog.csdn.net/weixin_44565784/article/details/100013246