Android:RecyclerView

章节中所有代码和笔记均参考、摘录自《第一行代码(第二版)》

使用RecyclerView实现滚动窗口

实现Fruit类

public class Fruit {
    private String name;
    private int imageID;
    public Fruit(String name,int imageID){
        this.name = name;
        this.imageID = imageID;
    }
    public String getName(){
        return name;
    }
    public int getImageID(){
        return imageID;
    }
}

实现自定义布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <ImageView
        android:id="@+id/fruit_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView
        android:id="@+id/fruit_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp"/>
</LinearLayout>

实现FruitAdapter

public class FruitAdapter extends RecyclerView.Adapter<fruitadapter.viewholder> {
    private List<fruit> mFruitList;
    static class ViewHolder extends RecyclerView.ViewHolder{</fruit></fruitadapter.viewholder>
        //添加fruitView来保存子项最外层布局的实例<fruitadapter.viewholder><fruit>
        View fruitView;
        ImageView fruitImage;
        TextView fruitName;
        //ViewHolder内部类构造函数
        public ViewHolder(View view){
            super(view);</fruit></fruitadapter.viewholder>
            //传入RecyclerView子项的最外层布局<fruitadapter.viewholder><fruit>
            fruitView = view;
            fruitImage = view.findViewById(R.id.fruit_image);
            fruitName = view.findViewById(R.id.fruit_name);
        }
    }
    public FruitAdapter(List<fruit> fruitList){</fruit></fruit></fruitadapter.viewholder>
        //取得参数<fruitadapter.viewholder><fruit><fruit>
        mFruitList = fruitList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {</fruit></fruit></fruitadapter.viewholder>
        //创建实例<fruitadapter.viewholder><fruit><fruit>
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
        final ViewHolder holder = new ViewHolder(view);</fruit></fruit></fruitadapter.viewholder>
        
        //点击事件监听<fruitadapter.viewholder><fruit><fruit>
        holder.fruitView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = holder.getAdapterPosition();
                Fruit fruit = mFruitList.get(position);
                Toast.makeText(v.getContext(),"U click view "+fruit.getName(),Toast.LENGTH_SHORT).show();
            }
        });
        holder.fruitImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = holder.getAdapterPosition();
                Fruit fruit = mFruitList.get(position);
                Toast.makeText(v.getContext(),"U click image "+fruit.getName(),Toast.LENGTH_SHORT).show();
            }
        });</fruit></fruit></fruitadapter.viewholder>
        //返回实例<fruitadapter.viewholder><fruit><fruit>
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Fruit fruit = mFruitList.get(position);</fruit></fruit></fruitadapter.viewholder>
        //对对象进行赋值<fruitadapter.viewholder><fruit><fruit>
        holder.fruitImage.setImageResource(fruit.getImageID());
        holder.fruitName.setText(fruit.getName());
    }

    @Override
    public int getItemCount() {
        return mFruitList.size();
    }
}</fruit></fruit></fruitadapter.viewholder>

Activity的实现

public class VerticalMode extends AppCompatActivity {
    private List<Fruit> fruitList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_vertical_mode);
        initFruit();
        RecyclerView recyclerView = findViewById(R.id.recyclerViewVer);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        FruitAdapter adapter = new FruitAdapter(fruitList);
        recyclerView.setAdapter(adapter);
    }
    private void initFruit(){
        for(int i=0;i<2;i++){
            Fruit apple = new Fruit("Apple",R.drawable.apple);
            fruitList.add(apple);
            Fruit banana = new Fruit("Banana",R.drawable.banana);
            fruitList.add(banana);
            Fruit blackberry = new Fruit("Blackberry",R.drawable.blackberry);
            fruitList.add(blackberry);
            Fruit cherries = new Fruit("Cherries",R.drawable.cherries);
            fruitList.add(cherries);
            Fruit orange = new Fruit("Orange",R.drawable.orange);
            fruitList.add(orange);
            Fruit peach = new Fruit("Peach",R.drawable.peach);
            fruitList.add(peach);
        }
    }
}

运行结果

图像和文字都可实现点击