RecycleView 实现页面顶部图片的滑动

本文介绍如何在Android应用中使用RecyclerView组件,并实现其项的点击事件。通过具体实例展示了如何配置布局管理器、创建适配器及视图持有者等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.总结记录:

  1. 不经一番寒彻骨,怎得梅花扑鼻香
  2. 主要理解适配Apapter 中怎么实现的就比较好
  3. 更多细节 见代码注释
  4. 完整项目链接:记录于阿里云盘
  5. 修改为图二的效果
    5.1只需要将:
    7.*注册点击事件
 //        /*布局管理器,用于设置使用的布局是什么?这里为this即为线性*/
//        LinearLayoutManager manager = new LinearLayoutManager(this);
//        /*用于设置布局的排列方式 setOrientation*/
//        manager.setOrientation(LinearLayoutManager.HORIZONTAL);

修改为:

 StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);

参考Android studio:https://developer.android.google.cn/guide/topics/ui/layout/recyclerview?hl=en#java

在这里插入图片描述
在这里插入图片描述

总的预览
在这里插入图片描述

FruitAdapter:

package com.example.recyclerview;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

/**
 * @author chenzi
 */
public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {

    /**用于存贮数据*/
    private List<Fruit> mFruitList;

    /**类的构造方法*/
    public FruitAdapter(List<Fruit> fruitList) {
        mFruitList = fruitList;
    }

    @NonNull
    @Override
    public FruitAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        /**第一个参数是:需要加载的布局
         * 第二个参数是:为加载进来的布局添加一个父布局
         * 第三个参数:只让我们在父布局申明的布局生效*/
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }


    @Override
    /**赋值
     * 首先获取到当前的位置
     * 然后调用Fruit类中的方法进行赋值
     * 注意结合 Fruit和 MainActivity来看*/
    public void onBindViewHolder(@NonNull FruitAdapter.ViewHolder holder, int position) {
        Fruit fruit = mFruitList.get(position);
        holder.fruitImage.setImageResource(fruit.getImageId());
        holder.fruitName.setText(fruit.getName());
    }

    @Override
    public int getItemCount() {
        return mFruitList.size();
    }

    /**上面三个方法都是必须实现的抽象方法
     * 由于继承RecyclerView.Adapter<FruitAdapter.ViewHolder>*/
   static class ViewHolder extends RecyclerView.ViewHolder {
       ImageView fruitImage;
       TextView fruitName;
       /**相当于是一个一个的读入的,一次加载一个
        *引用布局文件中控件,用于绑定的时候使用*/
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            fruitImage = itemView.findViewById(R.id.fruit_image);
            fruitName = itemView.findViewById(R.id.fruit_name);
        }
    }
}

Fruit:

package com.example.recyclerview;

/**
 * @author chenzi
 */
public class Fruit {
    private String name;
    private int imageId;

    public int getImageId() {
        return imageId;
    }

    public String getName() {
        return name;
    }

    public Fruit(String name, int imageId) {
        this.name = name;
        this.imageId = imageId;
    }

}

MainActivity:

package com.example.recyclerview;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.view.View;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private List<Fruit> fruitList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*初始化数据 实际就是往fruitList中放入数据*/
        initFruit();
        RecyclerView recyclerView = findViewById(R.id.recycle_view);
        /*布局管理器,用于设置使用的布局是什么?这里为this即为线性*/
        LinearLayoutManager manager = new LinearLayoutManager(this);
        /*用于设置布局的排列方式 setOrientation*/
        manager.setOrientation(LinearLayoutManager.HORIZONTAL);

        recyclerView.setLayoutManager(manager);
        FruitAdapter fruitAdapter = new FruitAdapter(fruitList);
        recyclerView.setAdapter(fruitAdapter);
    }

    private void initFruit() {
        /*使用for是为了增加数据*/
        for (int i = 0; i < 2; i++) {
            /*第一个数据*/
            Fruit apple = new Fruit("草莓", R.drawable.a);
            fruitList.add(apple);
            /*第二个数据,以此内推*/
            Fruit caoMei = new Fruit("caoMei", R.drawable.caomei);
            fruitList.add(caoMei);
            Fruit apple1 = new Fruit("apple", R.drawable.apple);
            fruitList.add(apple1);
            Fruit xiangJiao = new Fruit("xiangJiao", R.drawable.jinju);
            fruitList.add(xiangJiao);
            Fruit juzi = new Fruit("juzi", R.drawable.jinju);
            fruitList.add(juzi);
            Fruit love = new Fruit("love", R.drawable.dongguo);
            fruitList.add(love);
            Fruit lisa = new Fruit("lisa", R.drawable.li);
            fruitList.add(lisa);
            Fruit li = new Fruit("li", R.drawable.shizi);
            fruitList.add(li);
            Fruit dognguo = new Fruit("dognguo", R.drawable.putao);
            fruitList.add(dognguo);
        }

    }
}

Fruit_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="100dp"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/fruit_image"
        android:layout_width="wrap_content"
        android:layout_height="100dp"
        android:layout_gravity="center_horizontal"/>

    <TextView
        android:id="@+id/fruit_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" />

</LinearLayout>

activity_mian.xml:

<?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="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycle_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

修改代码MainActivity中的:

        /**第一个参数是:需要加载的布局
         * 第二个参数是:为加载进来的布局添加一个父布局
         * 第三个参数:只让我们在父布局申明的布局生效*/
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item, parent, false);
        final ViewHolder holder = new ViewHolder(view);

        /**注册点击事件*/
        holder.fruitView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int position = holder.getBindingAdapterPosition();
                Fruit fruit = mFruitList.get(position);
                Toast.makeText(view.getContext(), "you clicked"+fruit.getName(), Toast.LENGTH_SHORT).show();
            }
        });
        holder.fruitImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int position = holder.getBindingAdapterPosition();
                Fruit fruit = mFruitList.get(position);
                Toast.makeText(view.getContext(), "you clicked"+fruit.getName(), Toast.LENGTH_SHORT).show();
            }
        });
        return holder;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值