Android模仿新浪微博(主页微博,评论界面)

主页微博:

获取当前登录用户及其所关注(授权)用户的最新微博接口:http://open.weibo.com/wiki/2/statuses/friends_timeline

代码详解:
1.异步get请求数据,由于数据中带图片,故需要多线程管理,参数设置按照接口一一对应。
2.请求的数据respone数据解析后,单条保存WeiboInfo数据域集合中,然后add到ArrayList中。
3.获取的数据,按布局加载到自定义Listview中(后面讲解),该自定义Listview具有滑动下拉刷新的功能。
4.刷新页面数据的方法,使用 adapater.notifyDataSetChanged()释放listview里的原数据,然后异步线程通知主线程重新获取数据。
5.GetDataTask类继承AsyncTask,以响应滑动下拉事件。改事件与手动按钮的刷新方法完全一致。

/*** Created by D&LL on 2016/7/20.* 主页模块*/
public class HomeActivity extends Activity {private OAuth oAuth = null;private RequestParams params;private String TAG = "HomeActivity";private Tools tools;private WeiboAdapter adapater = null;// 保存需要显示的多条微博数据public ArrayList<WeiBoInfo> weiboList = null;public static PullToRefreshListView listView;private ImageButton refresh;private TextView user_name;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.home);listView = (PullToRefreshListView) findViewById(R.id.Msglist);user_name = (TextView) findViewById(R.id.user_name);refresh = (ImageButton) findViewById(R.id.refresh);init();//按钮刷新微博refresh.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {refresh();}});//listview下拉刷新listView.setOnRefreshListener(new PullToRefreshListView.OnRefreshListener() {@Overridepublic void onRefresh() {new GetDataTask(HomeActivity.this, 0).execute();}@Overridepublic void onLoadMore() {}});}/*** 加载首页数据*/private void init() {tools = Tools.getInstance();getUserName();//获取微博数据weiboList = tools.getWeiboContent(this);if (weiboList != null) {// 创建一个Adapter设置ListView中的每项Item项数据adapater = new WeiboAdapter(HomeActivity.this, weiboList);listView.setAdapter(adapater);} else {adapater = new WeiboAdapter(HomeActivity.this, null);listView.setAdapter(adapater);}}/*** 用于标题栏显示用户名*/public void getUserName() {if (oAuth == null) {oAuth = OAuth.getOAuth(this);}params = new RequestParams();params.put("access_token", oAuth.getAccessToken());params.put("uid", oAuth.getUid());WeiboRestClient.get("2/users/show.json", params, new JsonHttpResponseHandler() {@Overridepublic void onSuccess(int statusCode, Header[] headers, JSONObject response) {try {String screen_name = response.getString("screen_name");user_name.setText(screen_name);} catch (JSONException e) {e.printStackTrace();}}@Overridepublic void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {super.onFailure(statusCode, headers, responseString, throwable);Log.i(TAG, "获取失败");}});}Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {//通知数据改变,更新listviewadapater.weiboList = (ArrayList<WeiBoInfo>) msg.obj;adapater.notifyDataSetChanged();}};//刷新页面数据的方法public void refresh() {adapater.weiboList.clear();adapater.notifyDataSetChanged();ArrayList<WeiBoInfo> new_contentList = tools.getWeiboContent(HomeActivity.this);Message msg = handler.obtainMessage();msg.obj = new_contentList;handler.sendMessage(msg);if (new_contentList != null) {// 创建一个Adapter设置ListView中的每项Item项数据adapater = new WeiboAdapter(HomeActivity.this, new_contentList);listView.setAdapter(adapater);} else {adapater = new WeiboAdapter(HomeActivity.this, null);listView.setAdapter(adapater);}}private class GetDataTask extends AsyncTask<Void, Void, String[]> {private Context context;private int index;public GetDataTask(Context context, int index) {this.context = context;this.index = index;}@Overrideprotected String[] doInBackground(Void... params) {return new String[0];}@Overrideprotected void onPostExecute(String[] result) {if (index == 0) {refresh();SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日  HH:mm");String date = format.format(new Date());// Call onRefreshComplete when the list has been refreshed.listView.onRefreshComplete(date);}super.onPostExecute(result);}}
}

使用httpClient get方法获得所需数据,对获得的json数据逐条解析,由于原创微博与转发微博json数据格式不同,故需要先判断解析不同部分然后处理相同部分。
使用 thread.start()释放异步线程的数据,以获得所需数据。
此处包含一个时间处理类(后面详解),计算微博发出时间距现在的时长。
该方法位于Tools类中

    /*** 自定义异步线程加载微博* 并对微博评论数据进行处理* 对线程进行处理可以获得返回值* @param context* @return*/public ArrayList<WeiBoInfo> getWeiboContent(Context context) {if (oAuth == null) {oAuth = oAuth.getOAuth(context);}class MyThread extends Thread {@Overridepublic void run() {String url = "https://api.weibo.com/2/statuses/friends_timeline.json";List<NameValuePair> params = new ArrayList<>();params.add(new BasicNameValuePair("access_token", oAuth.getAccessToken()));params.add(new BasicNameValuePair("count", "100"));String param = URLEncodedUtils.format(params, "UTF-8");HttpGet get = new HttpGet(url + "?" + param);httpClient = new DefaultHttpClient();try {HttpResponse responses = httpClient.execute(get);if (responses.getStatusLine().getStatusCode() == 200) {String r = EntityUtils.toString(responses.getEntity());JSONObject response = new JSONObject(r);//对获得的100条微博json数据遍历解析,放到对象集合中,然后添加到ArrayList里for (int i = 0; i < 100; i++) {WeiBoInfo weiBoInfo = new WeiBoInfo();JSONArray statuses = response.getJSONArray("statuses");JSONObject world = statuses.getJSONObject(i);JSONObject user = world.getJSONObject("user");//转发的微博if (world.has("retweeted_status")) {JSONObject retweeted_status = world.getJSONObject("retweeted_status");JSONObject retweeted_user = retweeted_status.getJSONObject("user");String retweeted_name = "@" + retweeted_user.getString("screen_name")+ ":";String text = world.getString("text") + ":\n" +retweeted_name +retweeted_status.getString("text");JSONArray img = retweeted_status.getJSONArray("pic_urls");weiBoInfo.setText(text);Boolean haveImg = false;if (img != null) {haveImg = true;String[] pics = new String[img.length()];for (int n = 0; n < img.length(); n++) {JSONObject pic = img.getJSONObject(n);pics[n] = pic.getString("thumbnail_pic");}weiBoInfo.setImage_context(pics);}weiBoInfo.setHaveImage(haveImg);} else {// 获得weibo内容String text = world.getString("text");JSONArray img = world.getJSONArray("pic_urls");weiBoInfo.setText(text);Boolean haveImg = false;if (img != null) {haveImg = true;String[] pics = new String[img.length()];for (int n = 0; n < img.length(); n++) {JSONObject pic = img.getJSONObject(n);pics[n] = pic.getString("thumbnail_pic");}weiBoInfo.setImage_context(pics);}weiBoInfo.setHaveImage(haveImg);}// 获得发weibo 用户的名称String name = user.getString("screen_name");// 获得发weibo 用户的头像url链接String userIcon = user.getString("avatar_large");// 获得发weibo的时间String time = world.getString("created_at");Date startDate = new Date(time);SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");time = sd.format(startDate);String nowtime = new DateUtils().getInterval(time);if (weiboList == null) {// 创建存储每条微博的集合weiboList = new ArrayList<>();}//数据设置weiBoInfo.setUserName(name);weiBoInfo.setTime(nowtime);weiBoInfo.setUserIcon(userIcon);// 将单条微博数据设置到集合中weiboList.add(weiBoInfo);/*  Log.i(TAG, time);Log.i(TAG, world.getString("text"));Log.i(TAG, user.getString("avatar_large"));*/}}} catch (IOException e) {e.printStackTrace();} catch (JSONException e) {e.printStackTrace();}}}//处理异步线程,以获得weibilist的返回值MyThread thread = new MyThread();thread.start();try {thread.join();} catch (InterruptedException e) {e.printStackTrace();}return weiboList;}

HomeActivity布局home.xml 改布有一个标题栏(包含手动刷新按钮,和显示用户名的TextView),一个自定义的ListView。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/ly_main_weixin"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/backgroundimage"android:orientation="vertical"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="45dp"android:background="@drawable/title_bar"><ImageButton
            android:id="@+id/refresh"android:layout_width="60dp"android:layout_height="match_parent"android:layout_alignParentStart="true"android:layout_alignParentTop="true"android:layout_marginStart="10dp"android:background="@drawable/refresh"/><TextView
            android:id="@+id/user_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:textColor="#fff"android:textSize="20sp"android:textStyle="bold"/></RelativeLayout><study.sinatest.util.PullToRefreshListView
        android:id="@+id/Msglist"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="0px"android:background="#BBFFFFFF"android:cacheColorHint="#00000000"android:divider="@drawable/link"android:dividerHeight="5px"android:fastScrollEnabled="true"android:focusable="true"/>
</LinearLayout>

评论

获取当前登录用户的最新评论包括接收到的与发出的接口:http://open.weibo.com/wiki/2/comments/timeline

该界面功能与主页微博功能除了数据处理略有不同,其余完全一致,不再详细叙述,有疑问请参考代码。
这里写图片描述这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31184.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

音视频技术开发周刊 | 291

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 谷歌将 AI 芯片团队并入云计算部门 追赶微软和亚马逊 OpenAI推出的ChatGPT获得一定成功&#xff0c;微软是OpenAI的重要投资者&#xff0c;它将ChatGPT植入必应搜索&#…

生成式AI年度观察 | 技术及产品快速迭代,生成内容质量及安全性仍需提升

原文链接&#xff1a; https://mp.weixin.qq.com/s/ED9mo5pxuDdyZmrFe-u7qw 一、2022年生成式AI发展观察 1.扩散模型和ChatGPT能力出众&#xff0c;多种生成模态涌现 扩散模型Diffusion&#xff08;以下简称“扩散模型”&#xff09;和神经网络模型CLIP结合&#xff0c;文生图实…

可信AI年度观察 | 生成式AI技术及产品快速迭代,生成内容质量及安全性仍需提升

自2021年起&#xff0c;生成式人工智能&#xff08;以下简称“生成式AI”&#xff09;连续两年入选Gartner《Hype Cycle for Artificial Intelligence》&#xff0c;被认为是未来重要的AI技术趋势。2022年以来&#xff0c;生成式AI产品不断涌现&#xff0c;生成内容模态多样&am…

孙燕姿谈“AI孙燕姿”:她的反应让人意外,深入体验揭示其背后的真相与潜力!

目录 前言AI歌手简介AI歌手的技术原理孙燕姿对“AI孙燕姿”的看法结论个人感受一、你听过AI歌手的音乐呈现吗&#xff1f;作为听众你的感受如何&#xff1f;二、你认为这种新型演艺模式能否获得广泛的市场认可&#xff1f;原因是什么&#xff1f;三、你认为AI歌手会取代流行歌手…

吞噬还是撬动?开发者如何应对大模型风暴?

责编 | 禾木木 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; ChatGPT 的出现几乎改变了 AI 的风向&#xff0c;各方大佬都丝毫不吝惜溢美之词&#xff0c;比尔盖茨说这种人工智能技术出现的重大意义&#xff0c;不亚于互联网和个人电脑的诞生&#xff1b;英伟达…

《花雕学AI》ChatGPT跟人类的思考方式有什么不同?

一、ChatGPT是一个基于GPT-3.5的对话语言模型&#xff0c;它可以根据用户的输入生成多轮对话&#xff0c;也可以生成文本、代码、音乐等内容。ChatGPT的思考方式是利用大量的数据和强大的算力来学习语言的联合概率分布&#xff0c;从而能够根据上下文和目标生成合理和有趣的回复…

跟着ChatGPT学PsychoPy编程1:绘制一个随按键而变化的进度条

让GPT帮忙绘制一个随按键而发生的进度条&#xff08;说的越详细越好&#xff09;&#xff1a; from psychopy import visual, event, core # 创建窗口 win visual.Window(size(800, 600), fullscrTrue) #True表示全屏 # 创建矩形框 rect visual.Rect(win, width0.1, height0.…

抖音服务器带宽有多大,才能供上亿人同时刷?

字节跳动有多少台服务器&#xff1f;字节跳动大型的数据中心出口带宽是多少&#xff1f; 最近看到一个有意思的提问&#xff1a;抖音服务器带宽有多大&#xff0c;为什么能够供那么多人同时刷&#xff1f;今天来给大家科普一下。 图片来自 Pexels 抖音&#xff0c;百度&#xf…

月报总结|Moonbeam 5月份大事一览

本月&#xff0c;Moonbeam迎来了Uniswap V3的部署&#xff0c;经过一年的社区讨论&#xff0c;UniSwap V3终于以5000万个同意票通过&#xff0c;将在未来一个月内部署于Moonbeam&#xff0c;为Web3用户提供更广泛公链生态的多链体验&#xff0c;加速应用之间跨链交互&#xff0…

月报总结|Moonbeam 4月份大事一览

本月&#xff0c;Moonbeam生态扶持进入下一里程碑&#xff01;探索更多优质的早期Web3项目&#xff0c;Moonbeam Accelerator Program已公布进入最终加速孵化阶段的10家初创公司&#xff0c;这些幸运项目将在未来3个月接受顶级孵化公司和专业投资机构的培训&#xff0c;于下半年…

惊人的算力成本背后,自动驾驶公司如何加速研发创新

【摘要】AI算法模型的开发&#xff0c;测试和训练是自动驾驶公司最重要的工作之一&#xff0c;它们都需要大量GPU算力来支撑。然而&#xff0c;“一人一卡”的简单独占式GPU分配方式会导致GPU分配率高但实际利用率低&#xff0c;造成大量算力的浪费。基于远程GPU的GPU池化技术能…

Flutter 中使用 OpenAI GPT-3 进行语义化处理

Flutter 中使用 OpenAI GPT-3 进行语义化处理 视频 https://www.bilibili.com/video/BV1AA411X7o3/ 前言 最近 openai 的 ChatGPT 火了&#xff0c;然后我也想着用它来做点什么&#xff0c;于是就写了个 调用 openai api 语言执行工具&#xff0c;跑个测试&#xff0c;以后再有…

谷歌云|机密 GKE 节点可在计算优化的 C2D 虚拟机上使用

机密 GKE 节点可用于计算优化的 C2D 虚拟机。 许多公司已采用 Google Kubernetes Engine (GKE) 作为其应用程序基础架构中的关键组件。在某些情况下&#xff0c;使用容器和 Kubernetes 的优势可以超越传统架构&#xff0c;但迁移到云端并在云端运行应用程序通常需要战略规划以降…

【打卡-Coggle竞赛学习2023年3月】对话意图识别

学习链接&#xff1a; https://coggle.club/blog/30days-of-ml-202303 ## Part1 内容介绍 本月竞赛学习将以对话意图识别展开&#xff0c;意图识别是指分析用户的核心需求&#xff0c;错误的识别几乎可以确定找不到能满足用户需求的内容&#xff0c;导致产生非常差的用户体验…

魔法咒语

魔法咒语 题目描述 Chandra 是一个魔法天才。从一岁时接受火之教会洗礼之后&#xff0c; Chandra 就显示出对火元素无与伦比的亲和力&#xff0c;轻而易举地学会种种晦涩难解的法术。这也多亏 Chandra 有着常人难以企及的语言天赋&#xff0c;让她能轻松流利地说出咒语中那些极…

网络舆情监测系统TOOM

在当今社会网络信息纷繁错杂&#xff0c;一条小小的舆情信息很可能引发异常舆情风暴&#xff0c;导致严重的舆情危机&#xff0c;而网络舆情监测系统能&#xff0c;更好地全面监测网络信息&#xff0c;未雨绸缪&#xff0c;精准把控&#xff0c;及时发现及时处理&#xff0c;为…

讯飞星火大模型V1.5发布 刘庆峰:我们要追赶OpenAI

雷递网 乐天 6月9日 讯飞星火认知大模型V1.5今日正式发布。讯飞称&#xff0c;时隔一月&#xff0c;星火大模型不仅各项能力获得持续提升&#xff0c;且在综合能力上实现三大升级&#xff1a;开放式知识问答取得突破&#xff0c;多轮对话、逻辑和数学能力再升级。星火APP同步发…

英伟达把GPT-4塞进我的世界,打游戏快15倍:AI大佬沉默了

深度学习自然语言处理 分享来自&#xff1a;机器之心 游戏行业可能要变天&#xff1f; 通用 AI 大模型 GPT-4 进游戏了&#xff0c;进的是开放世界&#xff0c;而且玩出了高水平。 昨天&#xff0c;英伟达发布的 VOYAGER 给 AI 圈内带来了一点小小的震撼。 VOYAGER 是第一个大模…

英伟达将GPT-4接入我的世界,无需人类插手,打游戏快15倍!

夕小瑶科技说 分享 来源 | 机器之心 游戏行业可能要变天&#xff1f; 通用 AI 大模型 GPT-4 进游戏了&#xff0c;进的是开放世界&#xff0c;而且玩出了高水平。 昨天&#xff0c;英伟达发布的 VOYAGER 给 AI 圈内带来了一点小小的震撼。 VOYAGER 是第一个大模型驱动&#…

AI前沿速报0427:多领域的AI技术突破

​ 人工智能&#xff08;AI&#xff09;技术不断创新&#xff0c;引领全球各行各业的变革。本期速报为您带来了近期AI领域的一些重要发展&#xff1a; 【一、AI在时尚产业的应用】 AI技术在时尚产业的应用方面取得显著进展&#xff0c;如趋势预测、产品设计、个性化推荐以及减…