android 高仿微信界面相册列表

主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
CSDN &《程序员》研发主编,投稿&纠错等事宜请致邮
你只管努力,剩下的交给时光!
如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件。而上帝在努力创造出更大更傻的傻瓜。目前为止,上帝是赢的。个人网站:www.xttblog.com。个人QQ群:、
个人大数据技术博客:http://www.iteblog.com
开发中很多时候要求实现的功能Android 高仿微信发朋友圈浏览图片效果(转)_技术交流_牛客网
Android 高仿微信发朋友圈浏览图片效果(转)
最近一直在高仿微信、高仿微信,今天小编再给大家分享一个仿微信发朋友圈浏览图片的效果....
好了,先看一下效果吧:
这里写图片描述
下面就来说一下具体怎么实现的:
1.首先我们要获取数据源,数据源就是我们的每条说说(包括姓名、标题、图片数组)
2.自定义适配器(ListView嵌套着GridView)
3.图片点击浏览图片(Fragment+ViewPager)
1.初始化数据源,设置适配器,看一下代码:
public class MyActivity extends Activity {
/*图片显示列表*/
private ListView listV
/*图片URL数组*/
private List&ContentBean& contentB
/*说说适配器*/
private MyA
* Called when the activity is first created.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initData();
initViews();
* 初始化数据
* by Hankkin at: 23:21:28
private void initData(){
contentBeans = new ArrayList&ContentBean&();
ArrayList&String& imgUrls1 = new ArrayList&String&();
imgUrls1.add(&http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8&);
ContentBean cb1 = new ContentBean(1,&java&,&Sun Microsystems&,imgUrls1);
contentBeans.add(cb1);
ArrayList&String& imgUrls2 = new ArrayList&String&();
imgUrls2.add(&http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8&);
imgUrls2.add(&http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8&);
imgUrls2.add(&http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8&);
ContentBean cb2 = new ContentBean(2,&OC&,&Stepstone&,imgUrls2);
contentBeans.add(cb2);
ArrayList&String& imgUrls3 = new ArrayList&String&();
imgUrls3.add(&http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8&);
imgUrls3.add(&http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8&);
imgUrls3.add(&http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8&);
imgUrls3.add(&http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8&);
imgUrls3.add(&http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8&);
imgUrls3.add(&http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8&);
imgUrls3.add(&http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8&);
imgUrls3.add(&http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8&);
imgUrls3.add(&http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8&);
ContentBean cb3 = new ContentBean(3,&python&,&Guido van Rossum&,imgUrls3);
contentBeans.add(cb3);
* 初始化组件
* by Hankkin at: 23:21:44
private void initViews(){
listView = (ListView) findViewById(R.id.lv_my);
adapter = new MyAdapter(MyActivity.this,contentBeans);
listView.setAdapter(adapter);
这里面的图片是我上传到七牛的网络图片,加载图片是用ImageLoader,下面也有具体的ImageLoader配置。
2.看一下适配器内容
在说说列表适配器中去设置图片的适配器,图片的GridView是重写了一个不能滑动的GridView,重写一下OnMeasure();
public class MyAdapter extends BaseAdapter {
private List&ContentBean&
public MyAdapter(Context context, List&ContentBean& data) {
this.context =
this.data =
public int getCount() {
return data.size();
public Object getItem(int i) {
return data.get(i);
public long getItemId(int i) {
public View getView(int i, View view, ViewGroup viewGroup) {
if (view == null) {
holder = new ViewHolder();
view = View.inflate(context, R.layout.item, null);
holder.gridView = (NoScrollGridView) view.findViewById(R.id.gridview);
holder.tvName = (TextView) view.findViewById(R.id.tv_name);
holder.tvTitle = (TextView) view.findViewById(R.id.tv_title);
view.setTag(holder);
holder = (ViewHolder) view.getTag();
final ContentBean bean = data.get(i);
holder.tvName.setText(bean.getName());
holder.tvTitle.setText(bean.getTitle());
if (data != null && data.size() & 0) {
holder.gridView.setAdapter(new ImageGridAdapter(context, bean.getImgUrls()));
* 图片列表点击事件
holder.gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView&?& adapterView, View view, int i, long l) {
Intent intent = new Intent(context, ImagePagerActivity.class);
intent.putExtra(ImagePagerActivity.EXTRA_IMAGE_URLS, (Serializable) bean.getImgUrls());
intent.putExtra(ImagePagerActivity.EXTRA_IMAGE_INDEX, i);
context.startActivity(intent);
class ViewHolder {
TextView tvName, tvT
NoScrollGridView gridV
3.然后就是图片浏览,这个网上也有好多的Demo,也有详细的讲解,直接拽过来用就可以了,下面的图片数量是监听
setOnPageChangeListener()来改变下面的图片索引值
* 图片查看器
* Created by Hankkin on 15/11/22.
public class ImagePagerActivity extends FragmentActivity {
private static final String STATE_POSITION = &STATE_POSITION&;
public static final String EXTRA_IMAGE_INDEX = &image_index&;
public static final String EXTRA_IMAGE_URLS = &image_urls&;
private HackyViewPager mP
private int pagerP
private TextV
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.image_detail_pager);
pagerPosition = getIntent().getIntExtra(EXTRA_IMAGE_INDEX, 0);
ArrayList&String& urls = getIntent().getStringArrayListExtra(EXTRA_IMAGE_URLS);
mPager = (HackyViewPager) findViewById(R.id.pager);
ImagePagerAdapter mAdapter = new ImagePagerAdapter(getSupportFragmentManager(), urls);
mPager.setAdapter(mAdapter);
indicator = (TextView) findViewById(R.id.indicator);
CharSequence text = getString(R.string.viewpager_indicator, 1, mPager.getAdapter().getCount());
indicator.setText(text);
// 更新下标
mPager.setOnPageChangeListener(new OnPageChangeListener() {
public void onPageScrollStateChanged(int arg0) {
public void onPageScrolled(int arg0, float arg1, int arg2) {
public void onPageSelected(int arg0) {
CharSequence text = getString(R.string.viewpager_indicator, arg0 + 1, mPager.getAdapter().getCount());
indicator.setText(text);
if (savedInstanceState != null) {
pagerPosition = savedInstanceState.getInt(STATE_POSITION);
mPager.setCurrentItem(pagerPosition);
public void onSaveInstanceState(Bundle outState) {
outState.putInt(STATE_POSITION, mPager.getCurrentItem());
private class ImagePagerAdapter extends FragmentStatePagerAdapter {
public ArrayList&String& fileL
public ImagePagerAdapter(FragmentManager fm, ArrayList&String& fileList) {
super(fm);
this.fileList = fileL
public int getCount() {
return fileList == null ? 0 : fileList.size();
public Fragment getItem(int position) {
String url = fileList.get(position);
return ImageDetailFragment.newInstance(url);
图片Fragment的详细界面,里面有长按点击事件,和图片加载的状态
package com.hankkin.WeiXinLookImgsDemo.
import android.graphics.B
import android.os.B
import android.support.v4.app.F
import android.view.LayoutI
import android.view.V
import android.view.ViewG
import android.widget.ImageV
import android.widget.ProgressB
import android.widget.T
import com.hankkin.WeiXinLookImgsDemo.R;
import com.nostra13.universalimageloader.core.ImageL
import com.nostra13.universalimageloader.core.assist.FailR
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingL
import com.others.PhotoViewA
* 单张图片显示Fragment
* Created by Hankkin on 15/11/22.
public class ImageDetailFragment extends Fragment {
private String mImageU
private ImageView mImageV
private ProgressBar progressB
private PhotoViewAttacher mA
public static ImageDetailFragment newInstance(String imageUrl) {
final ImageDetailFragment f = new ImageDetailFragment();
final Bundle args = new Bundle();
args.putString(&url&, imageUrl);
f.setArguments(args);
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mImageUrl = getArguments() != null ? getArguments().getString(&url&) :
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View v = inflater.inflate(R.layout.image_detail_fragment, container, false);
mImageView = (ImageView) v.findViewById(R.id.image);
mAttacher = new PhotoViewAttacher(mImageView);
mAttacher.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() {
public void onPhotoTap(View arg0, float arg1, float arg2) {
getActivity().finish();
mAttacher.setOnLongClickListener(new View.OnLongClickListener() {
public boolean onLongClick(View view) {
Toast.makeText(getActivity().getApplicationContext(),&保存&,Toast.LENGTH_SHORT).show();
progressBar = (ProgressBar) v.findViewById(R.id.loading);
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ImageLoader.getInstance().displayImage(mImageUrl, mImageView, new SimpleImageLoadingListener() {
public void onLoadingStarted(String imageUri, View view) {
progressBar.setVisibility(View.VISIBLE);
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
String message =
switch (failReason.getType()) {
case IO_ERROR:
message = &下载错误&;
case DECODING_ERROR:
message = &图片无法显示&;
case NETWORK_DENIED:
message = &网络有问题,无法下载&;
case OUT_OF_MEMORY:
message = &图片太大无法显示&;
case UNKNOWN:
message = &未知的错误&;
Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show();
progressBar.setVisibility(View.GONE);
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
progressBar.setVisibility(View.GONE);
mAttacher.update();
忘了ImageLoader的初始化工作了,给大家加上吧,我写到Application里了
private MyA
public void onCreate() {
super.onCreate();
initImageLoader(context);
* 初始化Imageloader
* by Hankkin at: 23:20:29
* @param context
public static void initImageLoader(Context context){
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_launcher)
.showImageOnFail(R.drawable.ic_launcher)
.resetViewBeforeLoading(false)
// default
.delayBeforeLoading(0)
.cacheInMemory(true) // default
.cacheOnDisk(true) // default
.considerExifParams(true) // default
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
.bitmapConfig(Bitmap.Config.ARGB_8888) // default
.displayer(new SimpleBitmapDisplayer()) // default
.handler(new Handler()) // default
File picPath = new File(Environment.getExternalStorageDirectory().getPath() + File.separator + &weixinlookimgdemo& + File.separator + &files&);
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.memoryCacheExtraOptions(480, 800) // default = device screen dimensions
.diskCacheExtraOptions(480, 800, null)
.threadPoolSize(3) // default
.threadPriority(Thread.NORM_PRIORITY - 1) // default
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new LruMemoryCache(2 * 1024 * 1024))
.memoryCacheSize(2 * 1024 * 1024)
.memoryCacheSizePercentage(13) // default
.diskCache(new UnlimitedDiscCache(picPath)) // default
.diskCacheSize(50 * 1024 * 1024)
.diskCacheFileCount(1000)
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
.imageDownloader(new BaseImageDownloader(context)) // default
.imageDecoder(new BaseImageDecoder(true)) // default
.defaultDisplayImageOptions(options) // default
.writeDebugLogs()
// Initialize ImageLoader with configuration.
ImageLoader.getInstance().init(config);
这个效果就很容易实现了,揣摩别人的APP很容易,但是我们要试着去实现别人的APP,生命在于折腾,折腾吧,亲们…..
最后小编把源码上传到了Github上,宝贝们,star吧
转自:http://blog.csdn.net/lyhhj/article/details/
扫描二维码,关注牛客网
下载牛客APP,随时随地刷题
京ICP备号-4
扫一扫,把题目装进口袋& 源码 & 安卓源码 & Android项目源码非常漂亮的图库相册图片自动分类官方下载
Android项目源码非常漂亮的图库相册图片自动分类 正式版
温馨提示:您的IP是
投诉建议: .cn
千万流量共享
百度高权重排名
高速下载:
本地下载:
聚超值推荐
最新游戏推荐 软件专题排行
同类软件下载排行
热门关键词Android高仿微信源码_仿微信聊天发现通讯录等界面_DD博客
android微信源码
收款微信号 dwtedx
支付宝帐户
比特币帐户
深度剖解各个领域业务流程、全面展示自己的所长及个人发展新思路
微信公众号 : (推荐)
备案信息 :
DD博客上的所有软件和源码Demo及相关资料均为软件商和个人工作总结或网友推荐及网络收集整理而来、仅供学习和研究使用、切勿用做商业用途、如有侵犯版权者、请来信到邮箱 : 指出、DD博客将立即修正、净化网络版权环境、同时DD博客也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害
& Copyright 2017. All rights reserved.Android 微信里---我---相册,这个功能,布局怎么写?代码怎么写?请大神解答_百度知道
Android 微信里---我---相册,这个功能,布局怎么写?代码怎么写?请大神解答
我有更好的答案
没有相片gridview的adapter就提供一个默认图片给它显示 后面一个textview显示张数,那个雨是标题的话也来个textview显示,没有数据那些textview就都为空或者设为gone1、布局。2:一个ListView,里头放些个textVIEW显示时间。一个gridVIEW用来显示相片
比如今天我发了一条状态,昨天是2条状态,前天是3条状态,也就是每天的状态条数不定,这样是不应该在listview里嵌套一个listview?
他这个相册是相片条数不定,嵌套一个gridview,你想做状态的话可以嵌套liSTVIEW.不过android中有个带下拉列表的Listview你也可考虑。
采纳率:66%
为您推荐:
其他类似问题
android的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 微信android版 的文章

 

随机推荐