移动端微信消息页实现
在上一篇中主界面实现说过微信四个页面中间都是是fragment的,并且四个fragment的布局都还没实现,所以这一篇主要实现微信消息界面的实现(第一个fragment)
微信消息页是可以上下滑动,每一个列表最多都有可显示五个数据,还可以点击列表
要实现上诉功能只需要在fragment布局中使用ListView,然后给ListView指定一个Item布局即可
修改微信消息界面fragment布局
weixin_fragment.xml
上述代码自定义了一个分割线
微信消息页每一个列表都有分割线,而系统自带的分割线是充满屏幕宽度的,所以要自己定义一个分割线
自定义分割线main_list_divider_line.xml
main_list_divider_line.xml
创建微信消息界面fragment中ListView对应的item布局
weixin_item.xml
修改微信消息界面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
上述代码具体的内容就不阐述了,代码都有注释。主要说一下上面给ListView设置适配器,它是自定义的适配器,通过继承系统自带适配器BaseAdapter,重写相应方法,把数据显示在LlistView对应的item布局相应组件上,至于为什么要自定义,因为微信消息页每一个列表都有至少两个图片数据,而要把图片加载到组件上需要用到工具类(后面会给出)
上面fragment.java代码自定义了一个适配器,现在就来创建它,创建之前,可以先创建包单独存放适配器,方便管理;
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> data; // 接受上下文 private Context context; // 声明内部类对象 private ViewHolder viewHolder; public ImageAdapter(Context context, List > data) { this.context = context; this.data = data; } // 返回的总个数 @Override public int getCount() { // TODO Auto-generated method stub return data.size(); } // 返回每个条目对应的数据 @Override public Object getItem(int position) { // TODO Auto-generated method stub return data.get(position); } // 返回的id @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } // 返回这个条目对应的控件对象 @Override public View getView(int position, View convertView, ViewGroup parent) { // 判断当前条目是否为null if (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 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 { @Override public 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 { @Override public 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布局默认是没有数据的,数据是从服务器获取的,下一篇会完善服务端功能,也希望大家可以关注脚本之家其他内容!