Android怎么自定义ViewGroup实现朋友圈九宫格控件
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,本文小编为大家详细介绍"Android怎么自定义ViewGroup实现朋友圈九宫格控件",内容详细,步骤清晰,细节处理妥当,希望这篇"Android怎么自定义ViewGroup实现朋友圈九宫格控件"文
千家信息网最后更新 2025年11月07日Android怎么自定义ViewGroup实现朋友圈九宫格控件二、使用
本文小编为大家详细介绍"Android怎么自定义ViewGroup实现朋友圈九宫格控件",内容详细,步骤清晰,细节处理妥当,希望这篇"Android怎么自定义ViewGroup实现朋友圈九宫格控件"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
一、简介
1.1、效果图如下

1.2、主要功能如下
1:单张图片的时候支持按照图片宽高比列在设定区域内自适应
2:Adapter方式绑定数据和UI
3:图片点击事件回调
4:设置图片间隔大小
5:自由通过Glide设置ImageView圆角效果
二、使用
2.1、自定义属性如下
2.2、布局中使用自定义NineImageLayout
2.3、Adapter方式绑定数据和UI
其中Glide.asBitmap是为了计算图片宽高,如果后台有返回图片的宽高可以省略这一步,直接setSingleImage(width, height,imageView),
Ps:如果可以建议后台返回图片宽高,这样可以避免单张图片的时候控件高度跳屏,比如我限制单张图片宽高在200dp范围,要展示宽1000px高500px的时候,在图片未加载完成时控件宽高为200dp,图片加载完成后高度变为100dp,会有一个不好的用户体验,所以建议上传图片的时候记录图片宽高信息
nineImageLayout.setAdapter(new NineImageAdapter() { @Override protected int getItemCount() { return mData.size(); } @Override protected View createView(LayoutInflater inflater, ViewGroup parent, int i) { return inflater.inflate(R.layout.item_img_layout, parent, false); } @Override protected void bindView(View view, final int i) { final ImageView imageView = view.findViewById(R.id.iv_img); Glide.with(mContext).load(mData.get(i)).into(imageView); if (mData.size() == 1) { Glide.with(mContext) .asBitmap() .load(mData.get(0)) .into(new SimpleTarget() { @Override public void onResourceReady(Bitmap bitmap, Transition super Bitmap> transition) { final int width = bitmap.getWidth(); final int height = bitmap.getHeight(); nineImageLayout.setSingleImage(width, height,imageView); } }); Glide.with(mContext).load(mData.get(0)).into(imageView); } else { Glide.with(mContext).load(mData.get(i)).into(imageView); } } @Override public void OnItemClick(int i, View view) { super.OnItemClick(position, view); Toast.makeText(mContext, "position:" + mData.get(i), Toast.LENGTH_SHORT).show(); } }); 2.4、列表里面使用
页面放一个RecyclerView
item布局如下
Activity中构造一下测试数据,大致代码如下
public class NineImageLayoutActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private MyAdapter mAdapter; private Random random; private final String URL_IMG = "http://q3x62hkt1.bkt.clouddn.com/banner/58f57dfa5bb73.jpg"; private final String URL_IMG_2 = "http://q3x62hkt1.bkt.clouddn.com/timg.jpeg"; private List> mList = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_nine_image_layout); random = new Random(); List testList = new ArrayList<>(); testList.add(URL_IMG_2); for (int i = 0; i < 100; i++) { int count = i % 9 + 1; List list = new ArrayList<>(); for (int j = 0; j < count; j++) { list.add(URL_IMG); } if (i % 8 == 0) { mList.add(testList); } mList.add(list); } mRecyclerView = findViewById(R.id.recyclerview); mAdapter = new MyAdapter(mList, this); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerView.setAdapter(mAdapter); }}
MyAdapter中设置数据
import java.util.List;/** * @author : ChenYangQi * date : 2020/1/16 13:49 * desc : */public class MyAdapter extends RecyclerView.Adapter{ private List > mList; private Context mContext; public MyAdapter(List
> mList, Context mContext) { this.mList = mList; this.mContext = mContext; } @NonNull @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.item_nine_img_layout_list, parent, false); return new MyViewHolder(view); } @Override public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) { final List
mData = mList.get(position); holder.tvTitle.setText("这是" + mData.size() + "张图片的标题"); final NineImageLayout nineImageLayout = holder.nineImageLayout; holder.nineImageLayout.setAdapter(new NineImageAdapter() { @Override protected int getItemCount() { return mData.size(); } @Override protected View createView(LayoutInflater inflater, ViewGroup parent, int i) { return inflater.inflate(R.layout.item_img_layout, parent, false); } @Override protected void bindView(View view, final int i) { final ImageView imageView = view.findViewById(R.id.iv_img); Glide.with(mContext).load(mData.get(i)).into(imageView); if (mData.size() == 1) { Glide.with(mContext) .asBitmap() .load(mData.get(0)) .into(new SimpleTarget () { @Override public void onResourceReady(Bitmap bitmap, Transition super Bitmap> transition) { final int width = bitmap.getWidth(); final int height = bitmap.getHeight(); nineImageLayout.setSingleImage(width, height,imageView); } }); Glide.with(mContext).load(mData.get(0)).into(imageView); } else { Glide.with(mContext).load(mData.get(i)).into(imageView); } } @Override public void OnItemClick(int i, View view) { super.OnItemClick(position, view); Toast.makeText(mContext, "position:" + mData.get(i), Toast.LENGTH_SHORT).show(); } }); } @Override public int getItemCount() { return mList.size(); } class MyViewHolder extends RecyclerView.ViewHolder { TextView tvTitle; NineImageLayout nineImageLayout; public MyViewHolder(@NonNull View itemView) { super(itemView); tvTitle = itemView.findViewById(R.id.tv_title); nineImageLayout = itemView.findViewById(R.id.nine_image_layout); } }}
读到这里,这篇"Android怎么自定义ViewGroup实现朋友圈九宫格控件"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
图片
控件
数据
时候
九宫
朋友
文章
内容
后台
布局
建议
效果
方式
高度
妥当
自由
不好
事件
代码
功能
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
北京回收sun服务器
魔兽世界怀旧服老数据库
软件开发的系统设计分为
现在的教学软件开发有哪些
我的世界高人气服务器手机版推荐
一个服务器电源能带两个主板吗
学软件开发得多少钱
数据库db的中文含义是什么
河南超频服务器批量定制
网络安全 徐
H3C服务器怎么做镜像
成都电商软件开发要多少钱
服务器模块缺失或故障
科学技术研究所大数据库
甘肃亦念互联网科技有限公司
水粉网络安全手抄报
聚类算法连接数据库
溧阳安卓软件开发
服务器搭配gpu卡
证书更新无法与服务器建立连接
桂阳安卓软件开发培训哪家好
网络技术和大数据应用技术
二手影吧服务器
世界数据库众生相
定制手机软件开发公司
互联网科技那点事
网络设备aaa服务器
计算机网络技术b卷答案
南京创惠互联网科技怎么样
贵州省网络安全支撑