这次去看到他有这个例子,就借鉴他的资料,自己写了一个,主要是我把BaseAdapter换成github上开源的BaseRecyclerViewAdapterHelper,其他的地方没有太大的改动,加了刷新和加载更多

先看效果图

引入我们要使用的工具

compile ‘com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30’

compile ‘com.android.support:recyclerview-v7:26.0.0-alpha1’

compile ‘com.google.code.gson:gson:2.2.4’

GlobalUtils包含获取assets资源,测量屏幕宽度等工具类

package tsou.cn.weibolist.util;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.Matrix;

import android.text.format.DateFormat;

import android.util.DisplayMetrics;

import java.io.ByteArrayOutputStream;

import java.io.InputStream;

public class GlobalUtils {

private static Context context;

private static int mScreenWidth;

private static int mScreenHeight;

private static float mDensity;

public static void init(Context context) {

GlobalUtils.context = context;

DisplayMetrics dm = context.getResources().getDisplayMetrics();

mScreenWidth = dm.widthPixels;

mScreenHeight = dm.heightPixels;

mDensity = dm.density;

}

/**

单位转换dp转px

*/

public static int dp2px(int dp) {

return (int) (dp * mDensity + 0.5f);

}

/**

读取assets目录下的文件 @param fileName 文件名 @return

*/

public static String readAssets(String fileName) {

String str = “”;

try {

InputStream stream = context.getResources().getAssets().open(fileName);

byte[] buffer = new byte[1024];

int len = -1;

ByteArrayOutputStream baos = new ByteArrayOutputStream();

while ((len = stream.read(buffer)) != -1) {

// 读取数据到内存中

baos.write(buffer, 0, len);

}

str = baos.toString(“utf-8”);

stream.close();

baos.close();

} catch (Exception e) {

e.printStackTrace();

}

return str;

}

public static String formatDate(long time) {

return DateFormat.format(“yyyy-MM-dd kk:mm:ss”, time).toString();

}

/**

根据图片名称获取资源id 例如:传入"avatar_01", 表示获取整数值R.drawable.avatar_01 @param context @param drawableName @return

*/

public static int getResId(Context context, String drawableName) {

return context.getResources().getIdentifier(

drawableName, “drawable”, context.getPackageName());

}

/**

获取宫格图片的宽高

*/

public static int getGridWidth() {

// 左边距: 10dp

// 右边距: 10dp

// 图片宫格的宽度 = (屏幕宽度-左边距-右边距) / 3

return (GlobalUtils.mScreenWidth - GlobalUtils.dp2px(10 + 10)) / 3;

}

/**

根据一张原图生成一张指定宽高的图片 @param bitmap 原图 @param width 要生成图片的宽高 @return

*/

public static Bitmap createBitmap(Bitmap bitmap, int width) {

float scaleX = ((float) width) / bitmap.getWidth();

float scaleY = ((float) width) / bitmap.getHeight();

Matrix matrix = new Matrix();

matrix.postScale(scaleX, scaleY);

return Bitmap.createBitmap(bitmap, 0, 0,

bitmap.getWidth(), bitmap.getHeight(), matrix, true);

}

}

初始化GlobalUtils类

package tsou.cn.weibolist;

import android.app.Application;

import tsou.cn.weibolist.util.GlobalUtils;

/**

Created by Administrator on 2017/11/13 0013.

*/

public class MyApplication extends Application {

@Override

public void onCreate() {

super.onCreate();

// 初始化GlobalUtils类

GlobalUtils.init(this);

}

}

主页列表布局

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

android:layout_width=“match_parent”

android:layout_height=“match_parent”

tools:context=“tsou.cn.weibolist.MainActivity”>

android:id=“@+id/swipe_refresh”

android:layout_width=“match_parent”

android:layout_height=“match_parent”>

android:id=“@+id/recycler_view”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

tools:layout_editor_absoluteX=“8dp”

tools:layout_editor_absoluteY=“8dp” />

创建列表adapter

package tsou.cn.weibolist.adapter;

import android.support.annotation.Nullable;

import android.support.v7.widget.GridLayoutManager;

import android.support.v7.widget.RecyclerView;

import android.view.View;

import android.view.ViewGroup;

import android.widget.TextView;

import com.chad.library.adapter.base.BaseQuickAdapter;

import com.chad.library.adapter.base.BaseViewHolder;

import java.util.List;

import tsou.cn.weibolist.R;

import tsou.cn.weibolist.bean.Weibo;

import tsou.cn.weibolist.util.EmojiUtil;

import tsou.cn.weibolist.util.GlobalUtils;

import tsou.cn.weibolist.util.LinkifyUtil;

/**

Created by Administrator on 2017/11/13 0013.

*/

public class WeiboAdapter extends BaseQuickAdapter {

public WeiboAdapter(@Nullable List data) {

super(R.layout.item_weibo, data);

}

@Override

protected void convert(BaseViewHolder helper, Weibo.WeiboBean item) {

helper.setText(R.id.tv_user, item.getUsername());

helper.setText(R.id.tv_user_introduction, item.getUser_introduction());

// 显示头像

int imageResId = GlobalUtils.getResId(helper.itemView.getContext(), item.getAvatar());

helper.setBackgroundRes(R.id.iv_avatar, imageResId);

// 微博内容

//helper.setText(R.id.tv_content, item.getContent());

EmojiUtil.setText((TextView) helper.getView(R.id.tv_content), item.getContent());

LinkifyUtil.addCustomLink((TextView) helper.getView(R.id.tv_content));

LinkifyUtil.addUserCustomLink((TextView) helper.getView(R.id.tv_content));

helper.setText(R.id.tv_date, GlobalUtils.formatDate(item.getDate()));

//展示九宫格

GridLayoutManager manager = new GridLayoutManager(mContext, 3);

RecyclerView mRecyclerView = helper.getView(R.id.rv_weibo_images);

mRecyclerView.setLayoutManager(manager);

ImageAdapter mAdapter = new ImageAdapter(null);

mRecyclerView.setAdapter(mAdapter);

//显示微博图片

int imageCount = item.getImageUrls() == null ? 0 : item.getImageUrls().size();

if (imageCount == 0) {//没有微博

mRecyclerView.setVisibility(View.GONE);

} else {//有微博

mRecyclerView.setVisibility(View.VISIBLE);

//刷新图片数据

mAdapter.setNewData(item.getImageUrls());

//动态指定图片宫格的宽高和recycleview的宽高

//1张图片->1列

//4张图片 ->2列

//其他 ->3列

ViewGroup.LayoutParams layoutParams = mRecyclerView.getLayoutParams();

if (imageCount == 1) {

manager.setSpanCount(1);

layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;

} else if (imageCount == 4) {

manager.setSpanCount(2);

//两个图片的宽度

layoutParams.width = GlobalUtils.getGridWidth() * 2;

} else {

manager.setSpanCount(3);

layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;

}

}

}

}

图片列表adapter

package tsou.cn.weibolist.adapter;

import android.support.annotation.Nullable;

import android.view.ViewGroup;

import com.chad.library.adapter.base.BaseQuickAdapter;

import com.chad.library.adapter.base.BaseViewHolder;

import java.util.List;

import tsou.cn.weibolist.R;

import tsou.cn.weibolist.util.GlobalUtils;

/**

Created by Administrator on 2017/11/13 0013.

*/

public class ImageAdapter extends BaseQuickAdapter {

public ImageAdapter(@Nullable List data) {

super(R.layout.item_image, data);

}

@Override

protected void convert(BaseViewHolder helper, String item) {

//动态设置图片宫格的宽高

//1张图片 -> 宫格的宽高为图片的宽高

//其他情况 -> 宫格的宽高为宽度3分之一

ViewGroup.LayoutParams layoutParams = helper.itemView.getLayoutParams();

int resId = GlobalUtils.getResId(mContext, item);

if (getItemCount() == 1) {//一张图片

layoutParams.width = GlobalUtils.getGridWidth() * 3;

layoutParams.height = GlobalUtils.getGridWidth() * 3;

// Bitmap bitmap = BitmapFactory.decodeResource(

// mContext.getResources(), resId);

// // 指定宫格的宽高为图片的宽高

// layoutParams.width = bitmap.getWidth();

// layoutParams.height = bitmap.getHeight();

helper.setBackgroundRes(R.id.iv_image, resId);

} else {

layoutParams.width = GlobalUtils.getGridWidth();

layoutParams.height = GlobalUtils.getGridWidth();

helper.setBackgroundRes(R.id.iv_image, resId);

}

}

}

显示文本和表情

package tsou.cn.weibolist.util;

import android.content.Context;

import android.content.res.Resources;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.text.SpannableString;

import android.text.style.ImageSpan;

import android.widget.TextView;

import java.util.HashMap;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

import tsou.cn.weibolist.R;

/**

Created by Administrator on 2017/11/13 0013.

*/

public class EmojiUtil {

/**

显示文本和表情 @param textView @param text

*/

public static void setText(TextView textView, String text) {

Context context = textView.getContext();

Resources resources = context.getResources();

SpannableString ss = new SpannableString(text);

// 正则表达式: [高兴]

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)

尾声

开发是需要一定的基础的,我是08年开始进入Android这行的,在这期间经历了Android的鼎盛时期,和所谓的Android”凉了“。中间当然也有着,不可说的心酸,看着身边朋友,同事一个个转前端,换行业,其实当时我的心也有过犹豫,但是我还是坚持下来了,这次的疫情就是一个好的机会,大浪淘沙,优胜劣汰。再等等,说不定下一个黄金浪潮就被你等到了。

330页 PDF Android核心笔记

几十套阿里 、字节跳动、腾讯、华为、美团等公司2020年的面试题

PDF和思维脑图,包含知识脉络 + 诸多细节

Android进阶系统学习视频

础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android) [外链图片转存中…(img-W22fQPwy-1711887576406)]

尾声

开发是需要一定的基础的,我是08年开始进入Android这行的,在这期间经历了Android的鼎盛时期,和所谓的Android”凉了“。中间当然也有着,不可说的心酸,看着身边朋友,同事一个个转前端,换行业,其实当时我的心也有过犹豫,但是我还是坚持下来了,这次的疫情就是一个好的机会,大浪淘沙,优胜劣汰。再等等,说不定下一个黄金浪潮就被你等到了。

330页 PDF Android核心笔记

[外链图片转存中…(img-SU43IRzr-1711887576406)]

几十套阿里 、字节跳动、腾讯、华为、美团等公司2020年的面试题

[外链图片转存中…(img-k6We9fJb-1711887576406)]

[外链图片转存中…(img-EuwXRTc5-1711887576406)]

PDF和思维脑图,包含知识脉络 + 诸多细节

[外链图片转存中…(img-C1i4NGUr-1711887576407)]

Android进阶系统学习视频

[外链图片转存中…(img-eif6nBHt-1711887576407)]

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

精彩链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。