资料和思维逻辑来源于网络学习——>黑马程序员

从大学起就一直有看黑马的一些视频,现在没事偶尔也会去看一下,
整体教学质量都是很不错的。

这次去看到他有这个例子,就借鉴他的资料,自己写了一个,主要是我把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// 图片宫格的宽度 = (屏幕宽度-左边距-右边距) / 3return (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 {@Overridepublic void onCreate() {super.onCreate();// 初始化GlobalUtils类GlobalUtils.init(this);}
}

主页列表布局

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"tools:context="tsou.cn.weibolist.MainActivity"><android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swipe_refresh"android:layout_width="match_parent"android:layout_height="match_parent"><android.support.v7.widget.RecyclerView
            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" /></android.support.v4.widget.SwipeRefreshLayout></FrameLayout>

创建列表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<Weibo.WeiboBean, BaseViewHolder> {public WeiboAdapter(@Nullable List<Weibo.WeiboBean> data) {super(R.layout.item_weibo, data);}@Overrideprotected 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<String, BaseViewHolder> {public ImageAdapter(@Nullable List<String> data) {super(R.layout.item_image, data);}@Overrideprotected 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);// 正则表达式: [高兴]Pattern p = Pattern.compile("\\[([A-Za-z\u4E00-\u9FA5]+)\\]");Matcher matcher = p.matcher(ss);while (matcher.find()) {// 匹配到一个表情字符串String emoji = matcher.group();// 过滤非表情符,比如: [xxx]if (EMOJI_DATAS.containsKey(emoji)) {   // 是表情才处理// 指定了一张图片Bitmap bitmap = BitmapFactory.decodeResource(resources, EMOJI_DATAS.get(emoji));bitmap = GlobalUtils.createBitmap(bitmap, GlobalUtils.dp2px(20));     // 图片的宽高为20dpImageSpan span = new ImageSpan(context, bitmap, ImageSpan.ALIGN_BOTTOM);int start = matcher.start();int end = matcher.end();ss.setSpan(span, start, end, 0);}}textView.setText(ss);}private static final HashMap<String, Integer> EMOJI_DATAS = new HashMap<String, Integer>();static {EMOJI_DATAS.put("[微笑]", R.drawable.smiley_0);EMOJI_DATAS.put("[伤心]", R.drawable.smiley_1);EMOJI_DATAS.put("[美女]", R.drawable.smiley_2);EMOJI_DATAS.put("[发呆]", R.drawable.smiley_3);EMOJI_DATAS.put("[墨镜]", R.drawable.smiley_4);EMOJI_DATAS.put("[大哭]", R.drawable.smiley_5);EMOJI_DATAS.put("[害羞]", R.drawable.smiley_6);EMOJI_DATAS.put("[闭嘴]", R.drawable.smiley_7);EMOJI_DATAS.put("[睡觉]", R.drawable.smiley_8);EMOJI_DATAS.put("[伤心]", R.drawable.smiley_9);EMOJI_DATAS.put("[冷汗]", R.drawable.smiley_10);EMOJI_DATAS.put("[发怒]", R.drawable.smiley_11);EMOJI_DATAS.put("[调皮]", R.drawable.smiley_12);EMOJI_DATAS.put("[呲牙]", R.drawable.smiley_13);EMOJI_DATAS.put("[惊讶]", R.drawable.smiley_14);EMOJI_DATAS.put("[难过]", R.drawable.smiley_15);EMOJI_DATAS.put("[酷]", R.drawable.smiley_16);EMOJI_DATAS.put("[汗]", R.drawable.smiley_17);EMOJI_DATAS.put("[抓狂]", R.drawable.smiley_18);EMOJI_DATAS.put("[吐]", R.drawable.smiley_19);EMOJI_DATAS.put("[偷笑]", R.drawable.smiley_20);EMOJI_DATAS.put("[快乐]", R.drawable.smiley_21);EMOJI_DATAS.put("[奇]", R.drawable.smiley_22);EMOJI_DATAS.put("[傲]", R.drawable.smiley_23);EMOJI_DATAS.put("[饿]", R.drawable.smiley_24);EMOJI_DATAS.put("[累]", R.drawable.smiley_25);EMOJI_DATAS.put("[惊恐]", R.drawable.smiley_26);EMOJI_DATAS.put("[汗]", R.drawable.smiley_27);EMOJI_DATAS.put("[高兴]", R.drawable.smiley_28);EMOJI_DATAS.put("[大兵]", R.drawable.smiley_29);EMOJI_DATAS.put("[奋斗]", R.drawable.smiley_30);EMOJI_DATAS.put("[骂]", R.drawable.smiley_31);EMOJI_DATAS.put("[疑问]", R.drawable.smiley_32);EMOJI_DATAS.put("[嘘]", R.drawable.smiley_33);EMOJI_DATAS.put("[晕]", R.drawable.smiley_34);EMOJI_DATAS.put("[痛苦]", R.drawable.smiley_35);EMOJI_DATAS.put("[衰]", R.drawable.smiley_36);EMOJI_DATAS.put("[鬼]", R.drawable.smiley_37);EMOJI_DATAS.put("[敲打]", R.drawable.smiley_38);EMOJI_DATAS.put("[再见]", R.drawable.smiley_39);EMOJI_DATAS.put("[冷汗]", R.drawable.smiley_40);EMOJI_DATAS.put("[挖鼻]", R.drawable.smiley_41);EMOJI_DATAS.put("[鼓掌]", R.drawable.smiley_42);EMOJI_DATAS.put("[出丑]", R.drawable.smiley_43);EMOJI_DATAS.put("[坏笑]", R.drawable.smiley_44);EMOJI_DATAS.put("[左嘘]", R.drawable.smiley_45);EMOJI_DATAS.put("[右嘘]", R.drawable.smiley_46);EMOJI_DATAS.put("[打哈欠]", R.drawable.smiley_47);EMOJI_DATAS.put("[鄙视]", R.drawable.smiley_48);EMOJI_DATAS.put("[委屈]", R.drawable.smiley_49);EMOJI_DATAS.put("[快哭了]", R.drawable.smiley_50);EMOJI_DATAS.put("[邪恶]", R.drawable.smiley_51);EMOJI_DATAS.put("[亲亲]", R.drawable.smiley_52);EMOJI_DATAS.put("[吓吓]", R.drawable.smiley_53);EMOJI_DATAS.put("[可怜]", R.drawable.smiley_54);EMOJI_DATAS.put("[菜刀]", R.drawable.smiley_55);EMOJI_DATAS.put("[西瓜]", R.drawable.smiley_56);EMOJI_DATAS.put("[啤酒]", R.drawable.smiley_57);EMOJI_DATAS.put("[篮球]", R.drawable.smiley_58);EMOJI_DATAS.put("[乒乓球]", R.drawable.smiley_59);EMOJI_DATAS.put("[喝茶]", R.drawable.smiley_60);EMOJI_DATAS.put("[吃饭]", R.drawable.smiley_61);EMOJI_DATAS.put("[猪头]", R.drawable.smiley_62);EMOJI_DATAS.put("[鲜花]", R.drawable.smiley_63);EMOJI_DATAS.put("[花谢]", R.drawable.smiley_64);EMOJI_DATAS.put("[吻]", R.drawable.smiley_65);EMOJI_DATAS.put("[红心]", R.drawable.smiley_66);EMOJI_DATAS.put("[心碎]", R.drawable.smiley_67);EMOJI_DATAS.put("[生日]", R.drawable.smiley_68);EMOJI_DATAS.put("[闪电]", R.drawable.smiley_69);EMOJI_DATAS.put("[地雷]", R.drawable.smiley_70);EMOJI_DATAS.put("[刀]", R.drawable.smiley_71);EMOJI_DATAS.put("[足球]", R.drawable.smiley_72);EMOJI_DATAS.put("[甲虫]", R.drawable.smiley_73);EMOJI_DATAS.put("[便便]", R.drawable.smiley_74);EMOJI_DATAS.put("[月亮]", R.drawable.smiley_75);EMOJI_DATAS.put("[太阳]", R.drawable.smiley_76);EMOJI_DATAS.put("[礼物]", R.drawable.smiley_77);EMOJI_DATAS.put("[拥抱]", R.drawable.smiley_78);EMOJI_DATAS.put("[强]", R.drawable.smiley_79);EMOJI_DATAS.put("[弱]", R.drawable.smiley_80);EMOJI_DATAS.put("[握手]", R.drawable.smiley_81);EMOJI_DATAS.put("[胜利]", R.drawable.smiley_82);EMOJI_DATAS.put("[抱拳]", R.drawable.smiley_83);EMOJI_DATAS.put("[勾引]", R.drawable.smiley_84);EMOJI_DATAS.put("[握拳]", R.drawable.smiley_85);EMOJI_DATAS.put("[差劲]", R.drawable.smiley_86);EMOJI_DATAS.put("[爱你]", R.drawable.smiley_87);EMOJI_DATAS.put("[No]", R.drawable.smiley_88);EMOJI_DATAS.put("[OK]", R.drawable.smiley_89);EMOJI_DATAS.put("[爱情]", R.drawable.smiley_90);EMOJI_DATAS.put("[飞吻]", R.drawable.smiley_91);EMOJI_DATAS.put("[跳跳]", R.drawable.smiley_92);EMOJI_DATAS.put("[发抖]", R.drawable.smiley_93);EMOJI_DATAS.put("[怄火]", R.drawable.smiley_94);EMOJI_DATAS.put("[转圈]", R.drawable.smiley_95);EMOJI_DATAS.put("[磕头]", R.drawable.smiley_96);EMOJI_DATAS.put("[回头]", R.drawable.smiley_97);EMOJI_DATAS.put("[跳绳]", R.drawable.smiley_98);EMOJI_DATAS.put("[投降]", R.drawable.smiley_99);EMOJI_DATAS.put("[激动]", R.drawable.smiley_100);EMOJI_DATAS.put("[乱舞]", R.drawable.smiley_101);EMOJI_DATAS.put("[献吻]", R.drawable.smiley_102);EMOJI_DATAS.put("[左太极]", R.drawable.smiley_103);EMOJI_DATAS.put("[右太极]", R.drawable.smiley_104);}
}

Linkify类自定义超链接

package tsou.cn.weibolist.util;import android.text.util.Linkify;
import android.widget.TextView;import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** 自定义超链接**/
public class LinkifyUtil {/*** 添加自定义超链接*/public static void addCustomLink(TextView textView) {Pattern pattern = Pattern.compile("\\@([A-Za-z0-9\u4E00-\u9FA5]+)\\.?");// http://www.baidu.com/path?uid=1&username=xxString scheme = "huangxiaoguo://user?id=";// 匹配过滤器Linkify.MatchFilter matchFilter = new Linkify.MatchFilter() {@Overridepublic boolean acceptMatch(CharSequence s, int start, int end) {String text = s.subSequence(start, end).toString();if (text.endsWith(".")) { // 邮箱,不需要匹配return false;} else {return true;    // 返回true会显示为超链接}}};Linkify.TransformFilter transformFilter = null;Linkify.addLinks(textView, pattern, scheme, matchFilter, transformFilter);}public static void addUserCustomLink(TextView textView) {// @用户:Pattern pattern = Pattern.compile("\\#([A-Za-z0-9\u4E00-\u9FA5]+)\\#");// http://www.baidu.com/path?uid=1&username=xxString scheme = "huangxiaoguo://topic?id=";// 匹配过滤器Linkify.MatchFilter matchFilter = new Linkify.MatchFilter() {@Overridepublic boolean acceptMatch(CharSequence s, int start, int end) {String text = s.subSequence(start, end).toString();return true;}};Linkify.TransformFilter transformFilter = new Linkify.TransformFilter() {@Overridepublic String transformUrl(Matcher match, String url) {return match.group(1);}};Linkify.addLinks(textView, pattern, scheme, matchFilter, transformFilter);}
}

manifest配置点击用户链接时,要调起该Activity

 <!--点击用户链接时,要调起该Activity--><activity android:name=".avtivity.UserActivity"><intent-filter><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.DEFAULT"/><data android:scheme="huangxiaoguo" android:host="user"/></intent-filter></activity><activity android:name=".avtivity.TopicActivity"><intent-filter><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.DEFAULT"/><data android:scheme="huangxiaoguo" android:host="topic"/></intent-filter></activity>

主页逻辑

package tsou.cn.weibolist;import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;import com.chad.library.adapter.base.BaseQuickAdapter;
import com.google.gson.Gson;import java.util.ArrayList;
import java.util.List;import tsou.cn.weibolist.adapter.WeiboAdapter;
import tsou.cn.weibolist.bean.Weibo;
import tsou.cn.weibolist.util.GlobalUtils;
import tsou.cn.weibolist.view.CustomLoadMoreView;public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener,BaseQuickAdapter.RequestLoadMoreListener {private RecyclerView mRecyclerView;private WeiboAdapter mAdapter;private SwipeRefreshLayout mSwipeRefresh;private int mLastIndex;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initRecyclerView();initListener();mAdapter.setEnableLoadMore(false);mSwipeRefresh.setRefreshing(true);fetchData(true);}private void initView() {mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);mSwipeRefresh = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh);mSwipeRefresh.setColorSchemeColors(Color.rgb(63, 81,181));}private void initRecyclerView() {mRecyclerView.setLayoutManager(new LinearLayoutManager(this));mAdapter = new WeiboAdapter(null);mAdapter.isFirstOnly(false);mAdapter.openLoadAnimation(BaseQuickAdapter.ALPHAIN);mAdapter.setLoadMoreView(new CustomLoadMoreView());mRecyclerView.setAdapter(mAdapter);}private void initListener() {mSwipeRefresh.setOnRefreshListener(this);mAdapter.setOnLoadMoreListener(this, mRecyclerView);}private boolean mIsRefresh;private void fetchData(boolean isRefresh) {mIsRefresh = isRefresh;if (isRefresh) {mLastIndex = 1;}new AsyncTask<Void, Void, Void>() {private List<Weibo.WeiboBean> weibo;@Overrideprotected Void doInBackground(Void... voids) {SystemClock.sleep(3000);if (mLastIndex <= 3) {// 加载微博数据String json = GlobalUtils.readAssets("weibo_list.json");Gson gson = new Gson();weibo = gson.fromJson(json, Weibo.class).getWeibo();} else {weibo = new ArrayList<>();}return null;}@Overrideprotected void onPostExecute(Void aVoid) {super.onPostExecute(aVoid);if (mIsRefresh) {mAdapter.setNewData(weibo);mSwipeRefresh.setRefreshing(false);mAdapter.setEnableLoadMore(true);} else {if (weibo != null) {if (weibo.size() == 0) {mAdapter.loadMoreEnd();} else {mAdapter.addData(weibo);mAdapter.loadMoreComplete();}}}mLastIndex++;}}.execute();}@Overridepublic void onRefresh() {mAdapter.setEnableLoadMore(false);fetchData(true);}@Overridepublic void onLoadMoreRequested() {if (mSwipeRefresh != null) {mSwipeRefresh.setEnabled(false);fetchData(false);mSwipeRefresh.setEnabled(true);}}
}

主要的逻辑代码已经完成,需要资源的请看git

https://gitee.com/huangxiaoguo/WeiBoLieBiaoShiXian

腾讯微博列表展示的功能实现相关推荐

  1. 微信朋友圈,QQ空间,微博等列表展示的功能实现

    内容摘要 该控件能够应用于内容资讯展示的功能模块中,如:腾讯和新浪微博的微博列表,微信朋友圈及其它社交类应用的好友动态展示列表等:实现了类似腾讯微博的微博列表展示功能,包含微博文本内容,表情,图片,话 ...

  2. 体验腾讯微博聊天功能

    大海同学今天下午告诉我腾讯微博可以聊天了,我说的等级还不够.开始的时候说腾讯微博3级劳模可以聊天,我还没到3级,他说可以了,于是迅速打开微博果不其然可以了,立马跟大海体验了一下.还行吧,这个创新的功能 ...

  3. 【升级包】jeecg_online 支持主子表列表展示风格模板升级包,简易升级

    [升级包]Online新模板支持主子表列表展示风格 功能说明: 一对多模型的数据,可以在列表方式展示子表数据信息,支持多子表. 发布日期:  2017-12-11 版本兼容:  3.7.1 以上版本 ...

  4. (转)淘淘商城系列——MyBatis分页插件(PageHelper)的使用以及商品列表展示

    http://blog.csdn.net/yerenyuan_pku/article/details/72774381 上文我们实现了展示后台页面的功能,而本文我们实现的主要功能是展示商品列表,大家要 ...

  5. 腾讯内部转岗_别了,腾讯微博!

    腾讯微博网站9月4日发布公告称,将于2020年9月28日23时59分停止服务和运营,届时将无法登陆.以下为公告全文: 亲爱的用户: 感谢您使用腾讯微博.由于业务调整,腾讯微博将于2020年9月28日晚 ...

  6. 实现一个简易版的微博,包含 client 和 server 两部分,并实现四个基础功能:关注、取关、发微博、获取用户微博列表

    const assert = require('assert'); const question = '实现一个简易版的微博,包含 client 和 server 两部分,并实现四个基础功能:关注.取 ...

  7. redis+php微博,redis+php实现微博(三)微博列表功能详解

    本文实例讲述了redis+php实现微博列表功能.分享给大家供大家参考,具体如下: 个人主页显示微博列表(自己及关注人的微博列表) /*获取最新的50微博信息列表,列出自己发布的微博及我关注用户的微博 ...

  8. 网上书城项目的书籍分类列表展示及新书上架和热销书籍效果展示功能(项目进度四)

    网上书城项目的书籍分类列表展示及新书上架和热销书籍效果展示功能(项目进度四) 前言 需实现的目标(效果图) 书籍分类展示 新书上架展示 热销书籍展示 1.书籍分类展示(实现动态加载数据) 1.1 加载 ...

  9. CRM项目之stark组件之列表展示页面详细功能实现3

    分页 分页器组件代码 """ 分页组件 """class Pagination(object):def __init__(self, cur ...

最新文章

  1. 每个 Linux 用户都应该知道的命令行技巧
  2. display:none的表单也会被提交
  3. 【VS开发】VS2010中导入ActiveX控件
  4. 最强面试题整理第二弹:Python 进阶面试题(附答案)
  5. I2C详解(2) I2C总线的规范以及用户手册(1) I2C 总线协议
  6. 一个月的时间让你的词汇量翻一翻
  7. 去天翎咨询myapps2.4的问题
  8. java excel 打不开_Java使用POI生成Excel文件后打不开的问题
  9. 聊聊如何做技术战略规划
  10. 我,35岁程序员,离职前是这么做的
  11. a标签download属性无效_html常用标签大全
  12. 西门子1200PLC和Modbus485从站设备通讯
  13. mysql inet aton ipv6_Linux网络编程IPv4和IPv6的inet_addr、inet_aton、inet_pton等函数小结
  14. 【叶子函数分享三十】SQL简繁转换函数
  15. linux 16.04 密码,诡异的 登录 Linux / Ubuntu 16.04 系统 时, 系统提示 登录密码错误 之谜 !...
  16. 常见的几种协同设计平台对比分析
  17. Voting mechanism
  18. 「杂谈」程序猿必备的1700个英语单词
  19. 利用nps_payload 免杀360,腾讯电脑管家
  20. 串联谐振测试仪的原理是什么,RLC串联谐振电路详解

热门文章

  1. 华硕ROG枪神X一键重装Win11教学,能否联网均适用
  2. html5 3d 游戏开发,8个经典HTML5 3D动画赏析
  3. 荣耀v8手机空间清理
  4. [H5]CSS3样式(背景、文本、字体、链接、列表、表格和轮廓)
  5. windows下网络流量监控
  6. 交付时效提升20%,宁波银行规模化敏捷试点这一年
  7. git 撤回操作总结
  8. chmod命令详细用法
  9. java双引号之方法引用
  10. MySQL的一个表最多可以有多少个字段