日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

android 仿微信demo——微信消息界面實現(移動端)

瀏覽:233日期:2022-06-03 18:03:56
目錄移動端微信消息頁實現總結移動端微信消息頁實現

在上一篇中主界面實現說過微信四個頁面中間都是是fragment的,并且四個fragment的布局都還沒實現,所以這一篇主要實現微信消息界面的實現(第一個fragment)

微信消息頁是可以上下滑動,每一個列表最多都有可顯示五個數據,還可以點擊列表

android 仿微信demo——微信消息界面實現(移動端)

要實現上訴功能只需要在fragment布局中使用ListView,然后給ListView指定一個Item布局即可

修改微信消息界面fragment布局

weixin_fragment.xml

<LinearLayout xmlns:android='http://schemas.android.com/apk/res/android' android:layout_width='match_parent' android:layout_height='match_parent'> <ListViewandroid: android:layout_width='match_parent'android:layout_height='wrap_content'android:divider='@drawable/main_list_divider_line'android:dividerHeight='1.5px'android:layout_marginBottom='50dp'> </ListView></LinearLayout>

上述代碼自定義了一個分割線

微信消息頁每一個列表都有分割線,而系統自帶的分割線是充滿屏幕寬度的,所以要自己定義一個分割線

自定義分割線main_list_divider_line.xml

android 仿微信demo——微信消息界面實現(移動端)

android 仿微信demo——微信消息界面實現(移動端)

main_list_divider_line.xml

<?xml version='1.0' encoding='utf-8'?><layer-list xmlns:android='http://schemas.android.com/apk/res/android' > <itemandroid:left='80dp'android:right='0dp'><shape android:shape='rectangle' > <solid android:color='#33000000' /></shape> </item></layer-list>

創建微信消息界面fragment中ListView對應的item布局

weixin_item.xml

<?xml version='1.0' encoding='utf-8'?><LinearLayout xmlns:android='http://schemas.android.com/apk/res/android' android:layout_width='match_parent' android:layout_height='80dp' android:layout_marginTop='300dp' android:padding='10dp' android:orientation='horizontal'> <ImageViewandroid: android:layout_width='20dp'android:layout_height='wrap_content'android:layout_weight='0.5'/> <LinearLayoutandroid:orientation='vertical'android:layout_marginLeft='23dp'android:layout_width='8dp'android:layout_height='match_parent'android:layout_weight='4'><TextView android: android:textColor='#000000' android:textSize='18dp' android:gravity='center_vertical' android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_weight='2.5'/><TextView android: android:textColor='#A8A8A8' android:gravity='center_vertical' android:singleLine='true' android:layout_width='match_parent' android:layout_height='wrap_content' android:layout_weight='1.5'/> </LinearLayout> <LinearLayoutandroid:layout_width='wrap_content'android:layout_height='match_parent'android:paddingRight='-50dp'android:layout_weight='1'android:gravity='right'android:orientation='vertical'><TextView android: android:textColor='#A8A8A8' android:textSize='15dp' android:layout_gravity='right' android:layout_marginRight='1dp' android:layout_width='match_parent' android:layout_height='0dp' android:layout_weight='0.5'/><ImageView android: android:background='@color/white' android:layout_gravity='right' android:layout_width='match_parent' android:layout_height='0dp' android:layout_weight='0.5'/> </LinearLayout></LinearLayout>

修改微信消息界面fragment.java代碼

package com.example.wxchatdemo;import android.annotation.SuppressLint;import android.app.Fragment;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.annotation.Nullable;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import com.example.wxchatdemo.adapter.ImageAdapter;import org.json.JSONObject;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;@SuppressLint('ValidFragment')public class WeixinFragment extends Fragment { //微信號,用于查找微信消息列表 private String number; // 聲明組件 private ListView listView; // 創建集合用于存儲服務器發來的顯示微信消息列表的一些信息 private List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); //自定義的一個Hander消息機制 private MyHander myhander = new MyHander(); /*有參構造方法,參數為微信號*/ @SuppressLint('ValidFragment') WeixinFragment(String number) {this.number = number; } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {// 開一個線程完成網絡請求操作Thread thread1 = new Thread(new Runnable() { @Override public void run() {httpUrlConnPost(String.valueOf(number)); }});thread1.start();/*等待網絡請求線程完成*/try { thread1.join();} catch (InterruptedException e) { e.printStackTrace();}//獲取fragment布局View view = inflater.inflate(R.layout.weixin_fragment, container, false);//初始化組件listView = view.findViewById(R.id.listView);//創建自定義的適配器,用于把數據顯示在組件上BaseAdapter adapter = new ImageAdapter(getActivity().getApplicationContext(), list);//設置適配器listView.setAdapter(adapter);return view; } // 1.編寫一個發送請求的方法 // 發送請求的主要方法 public void httpUrlConnPost(String number) {HttpURLConnection urlConnection = null;URL url;try { // 請求的URL地地址 url = new URL( 'http://100.2.178.10:8080/AndroidServer_war_exploded/WeixinInformation'); urlConnection = (HttpURLConnection) url.openConnection();// 打開http連接 urlConnection.setConnectTimeout(3000);// 連接的超時時間 urlConnection.setUseCaches(false);// 不使用緩存 // urlConnection.setFollowRedirects(false);是static函數,作用于所有的URLConnection對象。 urlConnection.setInstanceFollowRedirects(true);// 是成員函數,僅作用于當前函數,設置這個連接是否可以被重定向 urlConnection.setReadTimeout(3000);// 響應的超時時間 urlConnection.setDoInput(true);// 設置這個連接是否可以寫入數據 urlConnection.setDoOutput(true);// 設置這個連接是否可以輸出數據 urlConnection.setRequestMethod('POST');// 設置請求的方式 urlConnection.setRequestProperty('Content-Type', 'application/json;charset=UTF-8');// 設置消息的類型 urlConnection.connect();// 連接,從上述至此的配置必須要在connect之前完成,實際上它只是建立了一個與服務器的TCP連接 JSONObject json = new JSONObject();// 創建json對象 //json.put('title', URLEncoder.encode(title, 'UTF-8'));// 使用URLEncoder.encode對特殊和不可見字符進行編碼 json.put('number', URLEncoder.encode(number, 'UTF-8'));// 把數據put進json對象中 String jsonstr = json.toString();// 把JSON對象按JSON的編碼格式轉換為字符串 // ------------字符流寫入數據------------ OutputStream out = urlConnection.getOutputStream();// 輸出流,用來發送請求,http請求實際上直到這個函數里面才正式發送出去 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));// 創建字符流對象并用高效緩沖流包裝它,便獲得最高的效率,發送的是字符串推薦用字符流,其它數據就用字節流 bw.write(jsonstr);// 把json字符串寫入緩沖區中 bw.flush();// 刷新緩沖區,把數據發送出去,這步很重要 out.close(); bw.close();// 使用完關閉 Log.i('aa', urlConnection.getResponseCode() + ''); //以下判?嗍欠裨L??成功,如果返回的狀態碼是200則說明訪問成功 if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {// 得到服務端的返回碼是否連接成功// ------------字符流讀取服務端返回的數據------------InputStream in = urlConnection.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(in));String str = null;StringBuffer buffer = new StringBuffer();while ((str = br.readLine()) != null) {// BufferedReader特有功能,一次讀取一行數據 System.out.println('測試:' + str); buffer.append(str);}in.close();br.close();JSONObject rjson = new JSONObject(buffer.toString());String str1 = rjson.getJSONObject('json').get('titleimg').toString();String[] pic = str1.split('rn');String str2 = rjson.getJSONObject('json').get('title').toString();String[] title = str2.split('rn');String str3 = rjson.getJSONObject('json').get('content').toString();String[] content = str3.split('rn');String str4 = rjson.getJSONObject('json').get('time').toString();String[] time = str4.split('rn');String str5 = rjson.getJSONObject('json').get('showcode').toString();String[] pic2 = str5.split('rn');for (int i = 0; i < pic.length; i++) { Map<String, Object> map = new HashMap<String, Object>(); map.put('pic', pic[i]); System.out.println('網址:' + pic[i]); map.put('title', title[i]); System.out.println('網址:' + title[i]); map.put('content', content[i]); map.put('time', time[i]); map.put('code', pic2[i]); list.add(map);//將map放到list集合中}boolean result = rjson.getBoolean('json');// 從rjson對象中得到key值為'json'的數據,這里服務端返回的是一個boolean類型的數據System.out.println('json:===' + result);//如果服務器端返回的是true,則說明跳轉微信頁成功,跳轉微信頁失敗if (result) {// 判斷結果是否正確 //在Android中http請求,必須放到線程中去作請求,但是在線程中不可以直接修改UI,只能通過hander機制來完成對UI的操作 myhander.sendEmptyMessage(1); Log.i('用戶:', '跳轉微信頁成功');} else { myhander.sendEmptyMessage(2); System.out.println('222222222222222'); Log.i('用戶:', '跳轉微信頁失敗');} } else {myhander.sendEmptyMessage(2); }} catch (Exception e) { e.printStackTrace(); Log.i('aa', e.toString()); System.out.println('11111111111111111'); myhander.sendEmptyMessage(2);} finally { urlConnection.disconnect();// 使用完關閉TCP連接,釋放資源} } // 在Android中不可以在線程中直接修改UI,只能借助Handler機制來完成對UI的操作 class MyHander extends Handler {@Overridepublic void handleMessage(Message msg) { super.handleMessage(msg); //判斷hander的內容是什么,如果是1則說明跳轉微信頁成功,如果是2說明跳轉微信頁失敗 switch (msg.what) {case 1: Log.i('aa', msg.what + ''); break;case 2: Log.i('aa', msg.what + ''); }} }}

上述代碼具體的內容就不闡述了,代碼都有注釋。主要說一下上面給ListView設置適配器,它是自定義的適配器,通過繼承系統自帶適配器BaseAdapter,重寫相應方法,把數據顯示在LlistView對應的item布局相應組件上,至于為什么要自定義,因為微信消息頁每一個列表都有至少兩個圖片數據,而要把圖片加載到組件上需要用到工具類(后面會給出)

上面fragment.java代碼自定義了一個適配器,現在就來創建它,創建之前,可以先創建包單獨存放適配器,方便管理;

android 仿微信demo——微信消息界面實現(移動端)

android 仿微信demo——微信消息界面實現(移動端)

ImageAdapter.java

package com.example.wxchatdemo.adapter;import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;import com.example.wxchatdemo.tools.GetImageByUrl;import com.example.wxchatdemo.R;import java.util.List;import java.util.Map;public class ImageAdapter extends BaseAdapter { // 要顯示的數據的集合 private List<Map<String, Object>> data; // 接受上下文 private Context context; // 聲明內部類對象 private ViewHolder viewHolder; public ImageAdapter(Context context, List<Map<String, Object>> data) {this.context = context;this.data = data; } // 返回的總個數 @Override public int getCount() {// TODO Auto-generated method stubreturn data.size(); } // 返回每個條目對應的數據 @Override public Object getItem(int position) {// TODO Auto-generated method stubreturn data.get(position); } // 返回的id @Override public long getItemId(int position) {// TODO Auto-generated method stubreturn position; } // 返回這個條目對應的控件對象 @Override public View getView(int position, View convertView, ViewGroup parent) {// 判斷當前條目是否為nullif (convertView == null) { viewHolder = new ViewHolder(); convertView = View.inflate(context, R.layout.weixin_item, null); viewHolder.img1 = (ImageView) convertView .findViewById(R.id.img1); viewHolder.title = (TextView) convertView .findViewById(R.id.title); viewHolder.content = (TextView) convertView .findViewById(R.id.content); viewHolder.time = (TextView) convertView .findViewById(R.id.time); viewHolder.code = (ImageView) convertView .findViewById(R.id.code); convertView.setTag(viewHolder);} else { viewHolder = (ViewHolder) convertView.getTag();}// 獲取List集合中的map對象Map<String, Object> map = data.get(position);// 獲取圖片的url路徑String pic = map.get('pic').toString();// 這里調用了圖片加載工具類的setImage方法將圖片直接顯示到控件上GetImageByUrl getImageByUrl = new GetImageByUrl();getImageByUrl.setImage(viewHolder.img1, pic);String title = map.get('title').toString();viewHolder.title.setText(title);String content = map.get('content').toString();viewHolder.content.setText(content);String time = map.get('time').toString();viewHolder.time.setText(time);// 獲取圖片的url路徑String code = map.get('code').toString();// 這里調用了圖片加載工具類的setImage方法將圖片直接顯示到控件上GetImageByUrl getImageByUrl2 = new GetImageByUrl();getImageByUrl2.setImage(viewHolder.code, code);return convertView; } /** * 內部類 記錄單個條目中所有屬性 * * * */ class ViewHolder {public ImageView img1;public TextView title;public TextView content;public TextView time;public ImageView code; }}

上面用到圖片加載工具類,后面會給出

在工具包tools中創建圖片加載工具類GetImageByUrl.java

GetImageByUrl.java

package com.example.wxchatdemo.tools;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Handler;import android.os.Message;import android.widget.ImageView;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;/** * 根據圖片url路徑獲取圖片 * * * */public class GetImageByUrl { private PicHandler pic_hdl; private ImageView imgView; private String url; /** * 通過圖片url路徑獲取圖片并顯示到對應控件上 * * * */ public void setImage(ImageView imgView, String url) {this.url = url;this.imgView = imgView;pic_hdl = new PicHandler();Thread t = new LoadPicThread();t.start(); } class LoadPicThread extends Thread {@Overridepublic void run() { Bitmap img = getUrlImage(url); System.out.println(img + '---'); Message msg = pic_hdl.obtainMessage(); msg.what = 0; msg.obj = img; pic_hdl.sendMessage(msg);} } class PicHandler extends Handler {@Overridepublic void handleMessage(Message msg) { Bitmap myimg = (Bitmap) msg.obj; imgView.setImageBitmap(myimg);} } public Bitmap getUrlImage(String url) {Bitmap img = null;try { URL picurl = new URL(url); HttpURLConnection conn = (HttpURLConnection) picurl .openConnection(); conn.setConnectTimeout(6000); conn.setDoInput(true); conn.setUseCaches(false); conn.connect(); InputStream is = conn.getInputStream(); img = BitmapFactory.decodeStream(is); is.close();} catch (Exception e) { e.printStackTrace();}return img; }}總結

到此微信消息頁移動端就完成了,由于服務端功能還沒實現,所以測試時微信消息頁顯示的是空白的,因為ListView對應Item布局默認是沒有數據的,數據是從服務器獲取的,下一篇會完善服務端功能,也希望大家可以關注好吧啦網其他內容!

標簽: 微信
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲福利一区| 亚洲精品福利| 精品一区二区三区视频在线播放 | 欧美国产另类| 久久影视三级福利片| 国产精品www.| av中文资源在线资源免费观看| 高清av一区| 91精品精品| 视频一区视频二区中文| 亚洲a成人v| 亚洲精品成人一区| 欧美日韩精品一区二区三区视频 | 在线亚洲精品| 天堂精品久久久久| 免费在线欧美黄色| 久久裸体视频| 中文字幕一区二区三区在线视频| 午夜亚洲福利| 久久免费视频66| 国产综合视频| 国产精品一区高清| 日韩一区二区三区免费| av不卡在线| 日韩高清在线观看一区二区| 欧美激情另类| 亚洲精品四区| 性欧美xxxx免费岛国不卡电影| 中文一区一区三区免费在线观 | 亚洲精品九九| 美女性感视频久久| 亚洲综合电影一区二区三区| 精品视频99| 亚洲精品免费观看| 日韩精品一区二区三区免费观看| 日韩国产欧美视频| 精品在线91| 精品香蕉视频| 69精品国产久热在线观看| 激情婷婷综合| 国产精品久久久久久久久久10秀| 中文一区一区三区免费在线观 | 中文字幕在线视频网站| 日韩手机在线| 男女精品网站| 香蕉精品久久| 免费看av不卡| 国产伊人久久| 国产精品调教视频| 日韩一区二区三区免费视频| 亚洲一区二区毛片| 久久激情网站| 亚洲成人av观看| 欧美xxxx中国| 久久久久久婷| 免费观看亚洲| 久久精品电影| 久久久久国产精品一区二区| 国产 日韩 欧美一区| 中文av在线全新| 国产成人精品亚洲日本在线观看| 中文字幕在线看片| 免费看av不卡| 好吊视频一区二区三区四区| 欧美日韩国产免费观看| 久久先锋影音| 涩涩涩久久久成人精品| 亚洲精品字幕| 97久久亚洲| 精品国产一区二区三区2021| 红杏一区二区三区| 日韩福利一区| 在线一区电影| 国产欧美日韩视频在线| 久久久久伊人| 日韩久久精品网| 国产亚洲网站| 久久狠狠久久| 亚洲成a人片| 亚洲一区不卡| 日韩精品一区二区三区免费视频 | 国产高清视频一区二区| 91亚洲人成网污www| 亚洲国产一区二区三区在线播放| 久久福利精品| 国产极品一区| 蜜桃一区二区三区| 日韩高清不卡在线| 日韩88av| 亚洲精品日韩久久| 成人一二三区| 亚洲三级精品| 欧美日韩视频免费观看| 亚洲综合五月| 国产成人免费精品| 99香蕉国产精品偷在线观看| 国产精品一区二区av交换 | 欧美一区=区| 国产一区精品福利| 日韩中文一区二区| 超级白嫩亚洲国产第一| 亚洲图片久久| 欧美日韩尤物久久| 国产精品多人| 亚洲日本国产| 久久精品国产www456c0m| 另类综合日韩欧美亚洲| 日韩中文字幕一区二区三区| 精品成av人一区二区三区| 亚洲欧美视频一区二区三区| 精品高清久久| 国产调教精品| 日本一区中文字幕| 亚洲免费影视| 91久久中文| 久久国产中文字幕| 日韩久久精品网| 精品久久久网| 麻豆91精品视频| 国产精品中文字幕亚洲欧美| 欧美视频久久| 日韩毛片一区| 婷婷成人av| 日韩视频1区| 日本一区二区三区中文字幕| 美女网站一区| 蜜臀av免费一区二区三区| 日韩在线观看不卡| 神马午夜久久| 久久久久久久久99精品大| 三上悠亚国产精品一区二区三区| 精品国产成人| 成人日韩av| 日韩天堂在线| 婷婷丁香综合| 免费人成在线不卡| 日本亚洲欧美天堂免费| 国产精品一区二区三区www| 久久99性xxx老妇胖精品| 国产精品久久久久久久免费软件| 国产精品一区二区精品视频观看| 日韩精品三区四区| 国产精品啊啊啊| аⅴ资源天堂资源库在线| 欧美亚洲精品在线| 热久久免费视频| 久久国产乱子精品免费女| 国产99在线| 亚洲综合另类| 欧美日韩亚洲一区三区| 色一区二区三区四区| 99视频在线精品国自产拍免费观看| 老鸭窝毛片一区二区三区| 奇米狠狠一区二区三区| 精品伊人久久久| 91精品国产福利在线观看麻豆| 日韩精品看片| 日韩三级久久| 久久精选视频| 青青青国产精品| 欧美日韩激情| 免费在线欧美黄色| 天堂成人免费av电影一区| 国产精品观看| 香蕉成人久久| 高清久久一区| 日本不卡一二三区黄网| 四虎4545www国产精品| 综合国产在线| 久久精品五月| 久久xxxx| 日韩精品一区二区三区免费观影| 日韩激情一区二区| 久久亚洲专区| 麻豆高清免费国产一区| 日本不卡高清| 国产精品婷婷| 国产传媒在线观看| 国产日韩一区二区三区在线| 伊人影院久久| 色吊丝一区二区| 国产精品福利在线观看播放| 欧美日本不卡高清| 日韩精品视频在线看| 合欧美一区二区三区| 日韩欧美中文| 午夜影院一区| 中文在线免费视频| 国产中文欧美日韩在线| 国产精品观看| 久久中文字幕一区二区三区| 国产日韩欧美一区在线| 欧美影院精品| 国产九九精品| 六月丁香综合在线视频| 久久精品国产成人一区二区三区| 日韩极品在线观看| 国产精品久久久久77777丨 | 午夜性色一区二区三区免费视频| 日韩一区二区免费看|