안 드 로 이 드 모방 위 챗 demo―위 챗 메시지 인터페이스 구현(모 바 일 엔 드)

이동 단 위 챗 메시지 페이지 구현
지난 편 에서 메 인 인터페이스 에서 위 챗 네 페이지 중간 에 모두 fragment 이 고 네 개의 fragment 의 구조 가 실현 되 지 않 았 기 때문에 이 편 은 주로 위 챗 메시지 인터페이스의 실현(첫 번 째 fragment)을 실현 했다.
위 챗 메시지 페이지 는 위아래 로 미 끄 러 질 수 있 습 니 다.목록 마다 최대 5 개의 데 이 터 를 표시 할 수 있 고 목록 을 클릭 할 수 있 습 니 다.
在这里插入图片描述
상소 기능 을 실현 하려 면 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">
    <ListView
        android:id="@+id/listView"
        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>
상기 코드 는 분할 선 을 사용자 정의 했다.
위 챗 메시지 페이지 의 모든 목록 에는 분할 선 이 있 고 시스템 자체 의 분할 선 은 화면 너비 가 가득 하기 때문에 스스로 분할 선 을 정의 해 야 합 니 다.
사용자 정의 분할 라인 mainlist_divider_line.xml
在这里插入图片描述
在这里插入图片描述
main_list_divider_line.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android: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">
    <ImageView
        android:id="@+id/img1"
        android:layout_width="20dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"/>
    <LinearLayout
        android:orientation="vertical"
        android:layout_marginLeft="23dp"
        android:layout_width="8dp"
        android:layout_height="match_parent"
        android:layout_weight="4">
        <TextView
            android:id="@+id/title"
            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:id="@+id/content"
            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>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:paddingRight="-50dp"
        android:layout_weight="1"
        android:gravity="right"
        android:orientation="vertical">
        <TextView
            android:id="@+id/time"
            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:id="@+id/code"
            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("\r
"); String str2 = rjson.getJSONObject("json").get("title").toString(); String[] title = str2.split("\r
"); String str3 = rjson.getJSONObject("json").get("content").toString(); String[] content = str3.split("\r
"); String str4 = rjson.getJSONObject("json").get("time").toString(); String[] time = str4.split("\r
"); String str5 = rjson.getJSONObject("json").get("showcode").toString(); String[] pic2 = str5.split("\r
"); 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 { @Override public 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.자바 코드 는 어댑터 를 사용자 정의 하 였 습 니 다.지금 바로 만 들 겠 습 니 다.만 들 기 전에 가방 을 만 들 고 어댑터 를 따로 저장 하여 관리 할 수 있 습 니 다.
在这里插入图片描述
在这里插入图片描述
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 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<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 {
        @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 레이아웃 은 기본적으로 데이터 가 없 기 때문에 데 이 터 는 서버 에서 얻 은 것 입 니 다.다음 편 은 서버 기능 을 보완 하고 우리 의 다른 내용 도 주목 해 주 십시오!

좋은 웹페이지 즐겨찾기