标题有点绕口,直接上一个效果图,如果符合你的需求的请在往下看,避免浪费你的时间

当当当当,标红的区域就是今天我们要干的活了 ,搞起来!

思路:

对android有点了解的人都知道在列表显示中我们可以使用GridLayoutManager这个布局可以轻松实现图片文字的一行显示的个数,所以在使用recyclerview渲染列表的时候我们就使用GridLayoutManager这个布局来代替以往的LinearLayoutManager
然后在适配器方面我们直接写一个类继承RecyclerView.Adapter来手把手实现我们想要的功能,其中我们在重写**getItemCount()**这个方法是 因为我们要在显示的图片列表的最后加上一个添加的图片 ,所以我们的这个方法返回的个数应该是我们当前数据的个数加1 这里也算是本章博客的一个小重点了,关于我们图片上传选择器布局的实现主要还是围绕这里进行扩展的。

好了,废话不多说,直接开始欢乐的代码时间!

主活动中的布局:


代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".activity.ContainSendActivity"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="50dp"><ImageViewandroid:layout_margin="5dp"android:layout_width="50dp"android:layout_height="50dp"android:src="@drawable/icon_back"/><Buttonandroid:textColor="#ffffff"android:layout_margin="@dimen/dp_10"android:background="#009933"android:layout_alignParentRight="true"android:text="发表"android:clickable="false"android:layout_width="wrap_content"android:layout_height="50dp"/></RelativeLayout><EditTextandroid:gravity="start"android:layout_margin="10dp"android:hint="记录点滴幸福。。。。"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@null"android:lines="6"/>
<androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/send_recycler"android:layout_width="match_parent"android:layout_height="wrap_content"/></LinearLayout>

两个recyclerview要显示的布局文件

这里就不贴效果图片了 很简单就是两个图片 显示的内容不同罢了
send_item_final.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/defaultimg"android:layout_width="match_parent"android:layout_height="wrap_content"android:adjustViewBounds="true"app:srcCompat="@drawable/icon_add"android:contentDescription="TODO" />
</androidx.cardview.widget.CardView>

send_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="4dp"android:orientation="vertical"><ImageViewandroid:id="@+id/imageView6"android:layout_width="match_parent"android:layout_height="wrap_content"android:adjustViewBounds="true"android:scaleType="centerCrop"android:src="@drawable/smart"/>
</androidx.cardview.widget.CardView>

适配器代码

public class SendBlogAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{private Context context;private List<String> data;private static final int ITEM_ONE=1;private static final int ITEM_TWO=2;public SendBlogAdapter(Context context,List<String> data){this.context = context;this.data = data;}@NonNull@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view;RecyclerView.ViewHolder holder;if(viewType==ITEM_TWO){view = LayoutInflater.from(parent.getContext()).inflate(R.layout.send_ittem_final,parent,false);holder = new AnoViewHolder(view);}else {view = LayoutInflater.from(parent.getContext()).inflate(R.layout.send_item,parent,false);holder = new ViewHolder(view);}return holder;}@Overridepublic void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {if (holder instanceof AnoViewHolder) {((AnoViewHolder) holder).img.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(context,"im specatil",Toast.LENGTH_SHORT).show();}});}else {((ViewHolder) holder).imageView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(context,"im nomal",Toast.LENGTH_SHORT).show();}});}}@Overridepublic int getItemCount() {return data.size()+1;}public class ViewHolder extends RecyclerView.ViewHolder {private ImageView imageView;public ViewHolder(View itemView) {super(itemView);imageView = itemView.findViewById(R.id.imageView6);}}public class AnoViewHolder extends RecyclerView.ViewHolder{private ImageView img;public AnoViewHolder(@NonNull View itemView) {super(itemView);img = itemView.findViewById(R.id.defaultimg);img.setOnClickListener(this);}}@Overridepublic int getItemViewType(int position) {if(position>data.size()-1){return ITEM_TWO;}else {return ITEM_ONE;}}
}

详解以及自己遇到的BUG分享

首先说明上面的适配器代码是修改好的 复制到你的程序中完全是可用的 ,只是将自己在实现这个功能时遇到的异常和大家做一个分享,避免你以后在遇到同样问题时不知道该如何去处理,也算是一个小的总结。

思路:

我们要在传过来的数据中进行判断,当当前显示的时最后一个传过来的数据时,我们在他的后面显示我们之前放好的添加图片的那个布局图片,所以我声明了2个变量在我们的**getItemViewType()方法中进行判断,如果当前的position大于我们穿过来的数据,就说明当前位置我们应该显示添加图片的那个布局了,然后我们在onCreateViewHolder()**中根据viewType参数进行比对,将我们要显示的添加图片显示上来 到这一步 我们的程序是可以实现静态布局的 注意这里说的是只是实现静态布局。

我遇到的BUG详解

我们在使用微信发朋友圈时 他是会根据我们点击选中的时图片还是添加进行判断,如果是选择的图片他会进入一个图片详情界面,如果是添加图片时他会执行另外一个逻辑,我第一次的思路是直接在一个ViewHolder中实例化我们两个布局中的ImageView ,在onBindViewHolder中看看代码会不会自动根据我们选中的图片进行逻辑处理,结果程序直接崩溃了,然后就写了两个viewHolder 都直接继承RecyclerView.ViewHolder,这样在onCreateViewHolder()中判断当前改初始化那个布局了,将结果返回给我们定义的ViewHolder中,然后在onBindViewHolder()中我们就可以根据holder找到他的孩子了 就可以进行两个布局中各事件的处理了

扩展

在adapter中处理我们的事件操作就不是很方便,我还想在选择图片时加一个底部弹出框,就想着把点击事件在我们要显示的布局中进行处理,就仿照点击事件接口将点击事件的触发写在了activity中
扩展后的adapter:

public class SendBlogAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{private Context context;private List<String> data;private static final int ITEM_ONE=1;private static final int ITEM_TWO=2;public SendBlogAdapter(Context context,List<String> data){this.context = context;this.data = data;}private OnItemClickListener clickListener;public void setClickListener(OnItemClickListener clickListener) {this.clickListener = clickListener;}public interface OnItemClickListener {void onClick(View view, int position);void onSelected(View view,int position);}@NonNull@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view;RecyclerView.ViewHolder holder;if(viewType==ITEM_TWO){view = LayoutInflater.from(parent.getContext()).inflate(R.layout.send_ittem_final,parent,false);holder = new AnoViewHolder(view);}else {view = LayoutInflater.from(parent.getContext()).inflate(R.layout.send_item,parent,false);holder = new ViewHolder(view);}return holder;}@Overridepublic void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {//        if (holder instanceof AnoViewHolder) {//            ((AnoViewHolder) holder).img.setOnClickListener(new View.OnClickListener() {//                @Override
//                public void onClick(View v) {//                    Toast.makeText(context,"im specatil",Toast.LENGTH_SHORT).show();
//                }
//            });
//        }else {//            ((ViewHolder) holder).imageView.setOnClickListener(new View.OnClickListener() {//                @Override
//                public void onClick(View v) {//                    Toast.makeText(context,"im nomal",Toast.LENGTH_SHORT).show();
//                }
//            });
//        }}@Overridepublic int getItemCount() {return data.size()+1;}public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{private ImageView imageView;public ViewHolder(View itemView) {super(itemView);imageView = itemView.findViewById(R.id.imageView6);imageView.setOnClickListener(this);}@Overridepublic void onClick(View v) {if(clickListener!=null){clickListener.onSelected(itemView, getAdapterPosition());}}}public class AnoViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{private ImageView img;public AnoViewHolder(@NonNull View itemView) {super(itemView);img = itemView.findViewById(R.id.defaultimg);img.setOnClickListener(this);}@Overridepublic void onClick(View v) {if(clickListener!=null){clickListener.onClick(itemView, getAdapterPosition());}}}@Overridepublic int getItemViewType(int position) {if(position>data.size()-1){return ITEM_TWO;}else {return ITEM_ONE;}}
}

最后就是在我们activity中的引用了:(这里使用的是kotlin)

       fun initData() {var array4 = arrayOf("1","2","3")send_recycler.layoutManager  = GridLayoutManager(this,3)var adapter = SendBlogAdapter(this, array4.toMutableList())send_recycler.adapter = adapteradapter.setClickListener(object :SendBlogAdapter.OnItemClickListener{override fun onSelected(view: View?, position: Int) {//添加图片点击的事件监听Toast.makeText(this@ContainSendActivity,"======",Toast.LENGTH_SHORT).show()}override fun onClick(view: View?, position: Int) {//选中已添加的图片点击的事件监听Toast.makeText(this@ContainSendActivity,"didia",Toast.LENGTH_SHORT).show()}})}

最后上一个我做好的效果图:

界面有点丑哈 在后面我会进行优化的 嘻嘻
欧克,到这里我们的仿微信朋友圈图片上传选择器布局的实现就算完成了。
在后面的章节中我也会将微信朋友圈的功能一点点的做出来的并且记录下来,动态添加删除图片,图片的选择方式,图片浏览的功能等等 ,,,
编写不易,请大家多多点赞支持 !!!!

Android仿微信朋友圈图片上传选择器布局相关推荐

  1. 仿微信朋友圈图片上传

    先贴上地址 项目地址 介绍 仿微信朋友圈的图片上传,图片上传缓存,断网后重新连接网络或者APP重启,自动上传未上传的图片 Config的阿里云配置需要自己添加 public class Config ...

  2. android 高仿朋友圈title,Android之高仿微信朋友圈图片上传

    碰到过很多上传图片的功能,大多都是要求是仿微信,不论是单图还是多图,更不知道是出于什么原因要去仿微信,总之,作为开发人员,很无奈,今天就把这种需求总结出来了,方便以后使用,下面就开始撸...... 一 ...

  3. android com.mylhyl,Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. photopicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

  4. android 微信高仿,Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. PhotoPicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

  5. Android仿微信朋友圈图片展示效果,图片查看器

    现在越来越多的APP都会有图片展示,这里是模仿微信朋友圈图片展示效果,图片查看器. 主要分为4部分: 1.透明Activity 2.计算gridView下iamgeView Item所在位置 3.一张 ...

  6. 仿微信朋友圈拍照上传

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. PhotoPicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

  7. Android仿微信朋友圈图片查看器

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/40264551 看博文之前,希望大家先打开自己的微信点到朋友圈中去,仔细观察是不是发 ...

  8. Android仿微信朋友圈图片打开退出过渡动画

    大家好,最近又是不断地改需求,终于闲下来了.看到微信朋友圈的图片打开退出的过渡动画,正好我们项目中也有类似功能,但是转换效果干巴巴的,麻麻赖赖的,一点都不圆润.没关系,盘他!先来看我实现的效果: 实现 ...

  9. Android 仿微信朋友圈图片效果

    转载:https://www.cnblogs.com/zhujiabin/p/7184001.html 最新项目需求展示图片,在网上找了一圈,发现这个比较好用,和大家分享一下.但是还有个图片的点击滑动 ...

最新文章

  1. 我所理解的卡尔曼滤波——公式推导与应用
  2. 清华本硕男,月入5W征婚引群嘲“普通却自信”,本人终于回应了!
  3. 一道拉普拉斯逆变换练习题和对应的数值计算方法
  4. 薛定谔的流量杠杆,网红电商上市的激励与诅咒
  5. 【Oracle】RAC集群中的命令
  6. 底图切换_如何用PPT切换效果制作时间轴推进动画?
  7. Lintcode68 Binary Tree Postorder Traversal solution 题解
  8. Spring Boot最核心的21个注解
  9. 手机c语言有趣的小程序,一个有趣的小程序
  10. pycharm快捷键大全
  11. 啊哈算法之炸弹人(广度优先搜索)
  12. 广东石油化工学院大学计算机基础,落实广东石油化工学院关于公布2013年度实验课题项目的通知...
  13. Linux服务器网络运维监控软件
  14. Vue项目上线的基本流程
  15. 寻道,思考人生的价值(观小米十周年演讲有感)
  16. lotus-miner 元数据备份
  17. 学习论文写作课程的心得体会
  18. 30岁的我,裸辞、自甘堕落、重回生活:成功转行Python工程师,月入1W+
  19. 自媒体up主怎么用ffmpeg剪视频
  20. stop slave mysql_mysql执行stop slave一直卡在Killing slave的状态

热门文章

  1. mybatis与spring整合详解
  2. 时间戳转时间精确到毫秒
  3. 铁憨憨的Python 爬虫学习 Python_Learn
  4. 【总结】PHP常见面试题汇总(一)。。。
  5. 小白学习latex的辅助资料
  6. Android---WMS核心分析
  7. “她经济”时代,兜售少女心的乙女游戏将成新风口?
  8. Typora配置smms图床
  9. 使用 GOLANG 发送邮件
  10. Unable to get offset lags for kafka. Reason: java.lang.NullPointerException at org.apache.storm.kafk