2024年安卓最新Android 自定义RecyclerView 实现真正的Gallery效果,android应用开发基础学堂在线答案

总结

其实要轻松掌握很简单,要点就两个:

  1. 找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。
  2. 多练。 (视频优势是互动感强,容易集中注意力)

你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。下面资料部分截图是我花费几个月时间整理的,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

android:layout_height=“120dp”

android:background=“@drawable/item_bg02” >

<ImageView

android:id=“@+id/id_index_gallery_item_image”

android:layout_width=“80dp”

android:layout_height=“80dp”

android:layout_alignParentTop=“true”

android:layout_centerHorizontal=“true”

android:layout_margin=“5dp”

android:scaleType=“centerCrop” />

<TextView

android:id=“@+id/id_index_gallery_item_text”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:layout_below=“@id/id_index_gallery_item_image”

android:layout_centerHorizontal=“true”

android:layout_marginBottom=“5dp”

android:layout_marginTop=“5dp”

android:textColor=“#ff0000”

android:text=“some info”

android:textSize=“12dp” />

数据适配器:

package com.example.zhy_horizontalscrollview03;

import java.util.List;

import android.content.Context;

import android.support.v7.widget.RecyclerView;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ImageView;

import android.widget.TextView;

public class GalleryAdapter extends

RecyclerView.Adapter<GalleryAdapter.ViewHolder>

{

private LayoutInflater mInflater;

private List mDatas;

public GalleryAdapter(Context context, List datats)

{

mInflater = LayoutInflater.from(context);

mDatas = datats;

}

public static class ViewHolder extends RecyclerView.ViewHolder

{

public ViewHolder(View arg0)

{

super(arg0);

}

ImageView mImg;

TextView mTxt;

}

@Override

public int getItemCount()

{

return mDatas.size();

}

/**

  • 创建ViewHolder

*/

@Override

public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)

{

View view = mInflater.inflate(R.layout.activity_index_gallery_item,

viewGroup, false);

ViewHolder viewHolder = new ViewHolder(view);

viewHolder.mImg = (ImageView) view

.findViewById(R.id.id_index_gallery_item_image);

return viewHolder;

}

/**

  • 设置值

*/

@Override

public void onBindViewHolder(final ViewHolder viewHolder, final int i)

{

viewHolder.mImg.setImageResource(mDatas.get(i));

}

}

可以看到数据适配器与BaseAdapter比较发生了相当大的变化,主要有3个方法:

getItemCount 这个不用说,获取总的条目数

onCreateViewHolder 创建ViewHolder

onBindViewHolder 将数据绑定至ViewHolder

可见,RecyclerView对ViewHolder也进行了一定的封装,但是如果你仔细观察,你会发出一个疑问,ListView里面有个getView返回View为Item的布局,那么这个Item的样子在哪控制?

其实是这样的,我们创建的ViewHolder必须继承RecyclerView.ViewHolder,这个RecyclerView.ViewHolder的构造时必须传入一个View,这个View相当于我们ListView getView中的convertView (即:我们需要inflate的item布局需要传入)。

还有一点,ListView中convertView是复用的,在RecyclerView中,是把ViewHolder作为缓存的单位了,然后convertView作为ViewHolder的成员变量保持在ViewHolder中,也就是说,假设没有屏幕显示10个条目,则会创建10个ViewHolder缓存起来,每次复用的是ViewHolder,所以他把getView这个方法变为了onCreateViewHolder。有兴趣的自己打印下Log,测试下。

最后在Activity中使用:

package com.example.zhy_horizontalscrollview03;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

import android.app.Activity;

import android.os.Bundle;

import android.support.v7.widget.LinearLayoutManager;

import android.support.v7.widget.RecyclerView;

import android.view.Window;

public class MainActivity extends Activity

{

private RecyclerView mRecyclerView;

private GalleryAdapter mAdapter;

private List mDatas;

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.activity_main);

initDatas();

//得到控件

mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview_horizontal);

//设置布局管理器

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);

linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);

mRecyclerView.setLayoutManager(linearLayoutManager);

//设置适配器

mAdapter = new GalleryAdapter(this, mDatas);

mRecyclerView.setAdapter(mAdapter);

}

private void initDatas()

{

mDatas = new ArrayList(Arrays.asList(R.drawable.a,

R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e,

R.drawable.f, R.drawable.g, R.drawable.h, R.drawable.l));

}

}

使用起来也很方便,唯一的区别就是要设置LayoutManager,目前只有一个实现类,就是LinearLayoutManager,可以设置为水平或者垂直。

最后效果图:

效果很不错,这就是RecyclerView的基本用法了,但是你会发现一个坑爹的地方,竟然没有提供setOnItemClickListener这个回调,要不要这么坑爹。。。

2、为RecyclerView添加OnItemClickListener回调

虽然它没有提供,但是添加个OnItemClickListener对我们来说还不是小菜一碟~

我决定在Adapter中添加这个回调接口:

package com.example.zhy_horizontalscrollview03;

import java.util.List;

import android.content.Context;

import android.support.v7.widget.RecyclerView;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.ViewGroup;

import android.widget.ImageView;

import android.widget.TextView;

public class GalleryAdapter extends

RecyclerView.Adapter<GalleryAdapter.ViewHolder>

{

/**

  • ItemClick的回调接口

  • @author zhy

*/

public interface OnItemClickLitener

{

void onItemClick(View view, int position);

}

private OnItemClickLitener mOnItemClickLitener;

public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener)

{

this.mOnItemClickLitener = mOnItemClickLitener;

}

private LayoutInflater mInflater;

private List mDatas;

public GalleryAdapter(Context context, List datats)

{

mInflater = LayoutInflater.from(context);

mDatas = datats;

}

public static class ViewHolder extends RecyclerView.ViewHolder

{

public ViewHolder(View arg0)

{

super(arg0);

}

ImageView mImg;

TextView mTxt;

}

@Override

public int getItemCount()

{

return mDatas.size();

}

@Override

public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)

{

View view = mInflater.inflate(R.layout.activity_index_gallery_item,

viewGroup, false);

ViewHolder viewHolder = new ViewHolder(view);

viewHolder.mImg = (ImageView) view

.findViewById(R.id.id_index_gallery_item_image);

return viewHolder;

}

@Override

public void onBindViewHolder(final ViewHolder viewHolder, final int i)

{

viewHolder.mImg.setImageResource(mDatas.get(i));

//如果设置了回调,则设置点击事件

if (mOnItemClickLitener != null)

{

viewHolder.itemView.setOnClickListener(new OnClickListener()

{

@Override

public void onClick(View v)

{

mOnItemClickLitener.onItemClick(viewHolder.itemView, i);

}

});

}

}

}

很简单,创建一个接口,提供一个设置入口,然后在onBindViewHolder中判断即可。

最后在主Activity中设置监听:

mAdapter = new GalleryAdapter(this, mDatas);

mAdapter.setOnItemClickLitener(new OnItemClickLitener()

{

@Override

public void onItemClick(View view, int position)

{

Toast.makeText(MainActivity.this, position+“”, Toast.LENGTH_SHORT)

.show();

}

});

mRecyclerView.setAdapter(mAdapter);

好了,这样就行了,看效果图:

效果还是不错的,接下来我想改成相册效果,即上面显示一张大图,下面的RecyclerView做为图片切换的指示器。

3、自定义RecyclerView实现滚动时内容联动

首先修改下布局:

布局文件:

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:tools=“http://schemas.android.com/tools”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:orientation=“vertical” >

<FrameLayout

android:layout_width=“fill_parent”

android:layout_height=“0dp”

android:layout_weight=“1” >

<ImageView

android:id=“@+id/id_content”

android:layout_width=“fill_parent”

android:layout_height=“fill_parent”

android:layout_gravity=“center”

android:layout_margin=“10dp”

android:scaleType=“centerCrop”

android:src=“@drawable/ic_launcher” />

<com.example.zhy_horizontalscrollview03.MyRecyclerView

android:id=“@+id/id_recyclerview_horizontal”

android:layout_width=“match_parent”

android:layout_height=“120dp”

android:layout_gravity=“bottom”

android:background=“#FF0000”

android:scrollbars=“none” />

添加一个显示大图的区域,把RecyclerView改为自己定义的。

然后看我们自定义RecyclerView的代码:

package com.example.zhy_horizontalscrollview03;

import android.content.Context;

import android.support.v7.widget.RecyclerView;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

public class CopyOfMyRecyclerView extends RecyclerView

{

public CopyOfMyRecyclerView(Context context, AttributeSet attrs)

{

super(context, attrs);

}

private View mCurrentView;

/**

  • 滚动时回调的接口

*/

private OnItemScrollChangeListener mItemScrollChangeListener;

public void setOnItemScrollChangeListener(

OnItemScrollChangeListener mItemScrollChangeListener)

{

this.mItemScrollChangeListener = mItemScrollChangeListener;

}

public interface OnItemScrollChangeListener

{

void onChange(View view, int position);

}

@Override

protected void onLayout(boolean changed, int l, int t, int r, int b)

{

super.onLayout(changed, l, t, r, b);

mCurrentView = getChildAt(0);

if (mItemScrollChangeListener != null)

{

mItemScrollChangeListener.onChange(mCurrentView,

尾声

如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

架构篇

《Jetpack全家桶打造全新Google标准架构模式》

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

ew,

尾声

如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。[外链图片转存中…(img-UxM99uop-1715802338597)]

PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-8f50xOQ1-1715802338597)]

架构篇

《Jetpack全家桶打造全新Google标准架构模式》
[外链图片转存中…(img-2GjEuui4-1715802338598)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 12
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值