Android微信界面

学习Android快一个月了,找个东西练练手,试着写写微信主要的四个界面。

效果图:

有色差...

首先看主界面划分,看图最直接:


主界面

activity_main.xml:

<RelativeLayout 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"
    android:id="@+id/main"
    tools:context="${relativePackage}.${activityClass}" >

	<RelativeLayout 
	    android:id="@+id/main_top"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:background="#333333"
	    android:orientation="horizontal"
	    android:gravity="center_vertical">
	    <TextView 
	        android:id="@+id/main_top_tv"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="微信"
	        android:textColor="#FFFFFF"
	        android:textSize="25dp"
	        android:layout_margin="10dp"/>

	    <ImageView
	        android:id="@+id/main_top_iv_add"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:layout_alignParentRight="true"
	        android:layout_alignTop="@+id/main_top_tv"
	        android:src="@android:drawable/ic_input_add"
	        android:layout_marginRight="10dp" />

	    <ImageView
	        android:id="@+id/main_top_iv_search"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:layout_alignTop="@+id/main_top_iv_add"
	        android:layout_toLeftOf="@+id/main_top_iv_add"
	        android:layout_marginRight="10dp"
	        android:src="@android:drawable/ic_menu_search" />

		</RelativeLayout>
	 <LinearLayout
        android:id="@+id/main_bottom"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:descendantFocusability="afterDescendants"
        android:layout_alignParentBottom="true"
        android:background="#cccccc">
	    <RadioGroup 
	        android:id="@+id/main_bottom_rg"
	        android:layout_width="match_parent"
	        android:layout_height="match_parent"
	        android:orientation="horizontal"
	        android:layout_marginTop="1dp"
	        android:gravity="center_vertical"
	        android:background="#FFFFFF">
	        <RadioButton 
	            android:id="@+id/main_bottom_rg_main"
	            android:drawableTop="@android:drawable/ic_dialog_email"
	            android:button="@null"
	            android:gravity="center_horizontal"
	            android:layout_weight="1"
	            android:text="微信"
	            android:checked="true"
	            android:textColor="@drawable/rb_color"/>
	        <RadioButton 
	            android:id="@+id/main_bottom_rg_contacts"
	            android:drawableTop="@android:drawable/ic_dialog_alert"
	            android:button="@null"
	            android:gravity="center_horizontal"
	            android:layout_weight="1"
	            android:textColor="@drawable/rb_color"
	            android:text="通讯录"/>
	        <RadioButton 
	            android:id="@+id/main_bottom_rg_find"
	            android:drawableTop="@android:drawable/ic_dialog_info"
	            android:button="@null"
	           	android:gravity="center_horizontal"
	           	android:layout_weight="1"
	           	android:textColor="@drawable/rb_color"
	            android:text="发现"/>
	        <RadioButton 
	            android:id="@+id/main_bottom_rg_self"
	            android:drawableTop="@android:drawable/ic_dialog_map"
	            android:button="@null"
             	android:gravity="center_horizontal"
             	android:layout_weight="1"
             	android:textColor="@drawable/rb_color"
	            android:text="我 "/>
	    </RadioGroup>
	 </LinearLayout>
	 
     <android.support.v4.view.ViewPager
        android:id="@+id/main_viewpager"
	    android:layout_width="match_parent"
	    android:layout_height="match_parent"
	    android:layout_below="@id/main_top"
	    android:layout_above="@id/main_bottom"
     />
</RelativeLayout>
MainActivity:

package com.edu.pro1202_weixin;

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.view.Window;
import android.widget.RadioButton;
import android.widget.RadioGroup;

import com.edu.adapter.ViewPagerAdapter;
import com.edu.fragment.ContactsFragment;
import com.edu.fragment.FindFragment;
import com.edu.fragment.MainFragment;
import com.edu.fragment.SelfFragment;

public class MainActivity extends FragmentActivity {

	private ViewPager viewPager;
	private List<Fragment> frags;
	private RadioGroup rg;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);
		
		viewPager = (ViewPager) findViewById(R.id.main_viewpager);
		rg = (RadioGroup) findViewById(R.id.main_bottom_rg);

		//添加Fragment
		frags = new ArrayList<>();
		frags.add(new MainFragment());
		frags.add(new ContactsFragment());
		frags.add(new FindFragment());
		frags.add(new SelfFragment());
		//ViewPager适配器
		ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager(), frags);
		viewPager.setAdapter(adapter);
		
		//设置监听器
		viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
			@Override
			public void onPageSelected(int arg0) {
				((RadioButton)rg.getChildAt(arg0)).setChecked(true);
			}
			
			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {
				
			}
			
			@Override
			public void onPageScrollStateChanged(int arg0) {
				
			}
		});
		
		//RadioGroup监听器
		rg.setOnCheckedChangeListener(
				new RadioGroup.OnCheckedChangeListener() {
			@Override
			public void onCheckedChanged(RadioGroup group, int checkedId) {
				int i = -1;
				switch (checkedId) {
				case R.id.main_bottom_rg_main:
					i = 0;
					break;
				case R.id.main_bottom_rg_contacts:
					i = 1;
					break;
				case R.id.main_bottom_rg_find:
					i = 2;
					break;
				case R.id.main_bottom_rg_self:
					i = 3;
					break;
				}
				//设置当前Fragment
				viewPager.setCurrentItem(i);
			}
		});
		
	}
}


微信界面(MainFragment)

main_frag_layout.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="match_parent"
    android:orientation="vertical" >
    
    <ListView 
        android:id="@+id/frag_main_lv"
		android:layout_width="match_parent"
		android:layout_height="match_parent"
		android:layout_marginLeft="10dp">
    </ListView>

</LinearLayout>
MainFragment:

package com.edu.fragment;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import com.edu.adapter.MainFragAdapter;
import com.edu.pro1202_weixin.R;

public class MainFragment extends Fragment {
	
	private ListView mainLv;

	private MainFragAdapter adapter;
	
	private List<HashMap<String, Object>> list;
	
	public MainFragment() {
		System.out.println("MainFragment Create!");
	}
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.main_frag_layout, null);
		
		//填充数据
		setData();
		adapter = new MainFragAdapter(list, getActivity());
		mainLv = (ListView) view.findViewById(R.id.frag_main_lv);
		mainLv.setAdapter(adapter);
		
		return view;
	}
	
	public void setData(){
		list = new ArrayList<>();
		HashMap<String, Object> map = null;
		for (int i = 0; i < 20; i++) {
			map = new HashMap<>();
			map.put("name", "好友"+i);
			map.put("time", "时间"+i);
			map.put("message", "消息"+i);
			list.add(map);
		}
	}
	
}

联系人界面(ContactsFragment)

contacts_frag_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:orientation="vertical"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">
                
  <TextView
          android:id="@+id/list_title"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:textSize="18dp"
          android:padding="5dp"
          android:background="#e1e1e1"
          android:textColor="#f00"
          android:text="a"
          android:layout_alignParentTop="true"
          android:visibility="gone">
  </TextView>

  <ListView android:id="@+id/listInfo"
            android:layout_below="@id/list_title"
            android:focusable="true"
            android:layout_weight="1.0"
            android:layout_height="match_parent"
            android:layout_width="fill_parent"
            android:scrollbars="none"
            android:cacheColorHint="#00000000"
            android:background="#fff">
  </ListView>

  <com.edu.util.ContactsRightTool
            android:id="@+id/rightCharacterListView"
            android:background="#08000000"
            android:layout_width="20dip"
            android:layout_height="fill_parent"
            android:layout_alignParentRight="true"/>
    
</RelativeLayout>
ContactsFragment
package com.edu.fragment;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.edu.adapter.ConstactsListAdapter;
import com.edu.pro1202_weixin.R;
import com.edu.util.MixComparator;
import com.edu.util.MyUtil;
import com.edu.util.ContactsRightTool;

public class ContactsFragment extends Fragment implements
	ListView.OnScrollListener, OnItemClickListener, OnClickListener {

    private ContactsRightTool letterListView;	//右侧字木栏
    private Handler handler;
    private int scrollState;	//滚动状态
    private ConstactsListAdapter quickLocationListAdapter;
    private ListView listMain;	//主界面的ListView
    //txtOverlay首字母悬浮提示框,listView的title顶部悬浮
    private TextView txtOverlay, title;	
    private WindowManager windowManager;

    private DisapearThread disapearThread;
    <span style="white-space:pre">	</span>//读取联系人姓名,生成数组
	private String[] stringArr = { "张杰", "胖子", "张胖子", "韩璐韩璐", "韩露", 
			"玛莎杀", "&&", "?", "瑶瑶瑶瑶", "尧尧", "成都", "上海", "老王",
			"武汉", "子弹", "狗头", "贺总", "zzzz广州", "广州", "上海",
			"cc", "aa" ,"dd"};

    private String[] stringArr3 = new String[0];	//右侧英文字母列表
    private ArrayList arrayList = new ArrayList();	//此列表添加所有拼音
    private ArrayList arrayList2 = new ArrayList(); //此列表添加所有拼音首字母
    private ArrayList arrayList3 = new ArrayList(); //此列表添加不规则字符
    //key为拼音
    private Map<String, String> map = new HashMap<String, String>();
	
    public ContactsFragment() {
    	System.out.println("ContactsFragment Create!");
	}
    
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.contacts_frag_main, null);
		 for (int i = 0; i < stringArr.length; i++) {
	            String pinyin = MyUtil.converterToPinYin(stringArr[i]);
	            arrayList.add(pinyin);
	            Collections.sort(arrayList, new MixComparator());
	            if (!arrayList2.contains(pinyin.substring(0, 1))
	            		&& MyUtil.isWord(pinyin.substring(0, 1))) {
	                arrayList2.add(pinyin.substring(0, 1));
	                //可能会重复,重新排序
	                Collections.sort(arrayList2, new MixComparator());
	            }
	            map.put(pinyin, stringArr[i]);
	        }
        stringArr = (String[]) arrayList.toArray(stringArr);

        arrayList3.add("#");                                     
        for (int i = 0; i < arrayList2.size(); i++) {
            String string = (String) arrayList2.get(i);
            //toUpperCase大写字母
            arrayList3.add(string.toUpperCase());       
        }
        arrayList3.add("*");
        
        // 得到右侧英文字母列表
        stringArr3 = (String[]) arrayList3.toArray(stringArr3); 
        
        letterListView = (ContactsRightTool) 
        		view.findViewById(R.id.rightCharacterListView);
        letterListView.setB(stringArr3);
        letterListView.setOnTouchingLetterChangedListener
        				(new LetterListViewListener());

        textOverlayout(view);

        // 初始化ListAdapter
        quickLocationListAdapter = new ConstactsListAdapter(
        					getActivity(), stringArr, this, map);
        listMain = (ListView) view.findViewById(R.id.listInfo);
        listMain.setOnItemClickListener(this);
        listMain.setOnScrollListener(this);
        listMain.setAdapter(quickLocationListAdapter);
        disapearThread = new DisapearThread();
		return view;
	}

	@Override
	public void onClick(View v) {
		
	}

	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {
		String personalName = map.get(stringArr[position]);
        Toast.makeText(getActivity(), personalName, 1).show();
	}

	
    /**
     * 设置悬浮字母
     */
    public void textOverlayout(View view)
    {
        handler = new Handler();
        
        title = (TextView) view.findViewById(R.id.list_title);
        
        txtOverlay = (TextView) LayoutInflater.from(getActivity()).inflate(
                R.layout.contacts_char, null);
        txtOverlay.setVisibility(View.INVISIBLE);
        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_APPLICATION,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                PixelFormat.TRANSLUCENT);
        windowManager = (WindowManager) getActivity()
        		.getSystemService(Context.WINDOW_SERVICE);
        windowManager.addView(txtOverlay, lp);
    }
    
    /**
     * 右侧导航条点击列表滚动指定位置
     */
    public class LetterListViewListener implements
            ContactsRightTool.OnTouchingLetterChangedListener
    {
        public void onTouchingLetterChanged(final String s)
        {
            int num = 0;
            // 联系人姓名和参数s进行比较
            for (int i = 0; i < stringArr.length; i++) {
                if ("a".equals(s) || "#".equals(s)) {      //顶部
                    num = 0;
                }
                
                else if ("*".equals(s)) {                      //底部
                    num = stringArr.length;
                    
                }else if (MyUtil.isWord(stringArr[i].substring(0, 1))
        		   && (MyUtil.character2ASCII(stringArr[i].substring(0, 1))
                				< (MyUtil.character2ASCII(s) + 32))) {
                	/**
                	 * 首先判断是字母,字母的ASCLL值小于参数s时,滚动位置+1;
                	 * 如果有10个数据小于s,就滚到10处
                	 */
                    num += 1; 
                }

            }
            if (num < 2) {
            	//设置ListView选中的位置,同时在Y轴设置一个偏移量
                listMain.setSelectionFromTop(num, 0);
            }
            else {
                listMain.setSelectionFromTop(num, 5);    //留点间隔
            }
        }
    }
    
	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount)     {
        title.setVisibility(View.VISIBLE);
        if (firstVisibleItem != 0) {
            title.setText(map.get(stringArr[firstVisibleItem]));
        }
        else {
            title.setText("a");
        }
        title.setText(map.get(stringArr[firstVisibleItem]));
        txtOverlay.setText(String.valueOf(stringArr[firstVisibleItem].charAt(0)));// 泡泡文字以第一个可见列表为准
    }
    
	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		this.scrollState = scrollState;
		if (scrollState == ListView.OnScrollListener.SCROLL_STATE_IDLE) {
			//removeCallbacks()是删除指定的Runnable对象,使线程对象停止运行
			handler.removeCallbacks(disapearThread);
			// 提示延迟1.0s再消失
			// postDelayed:延迟多少毫秒后开始运行
			boolean bool = handler.postDelayed(disapearThread, 1000);
		} else {
			txtOverlay.setVisibility(View.VISIBLE);
		}
	}

    /**
     * 延迟线程,用来是悬浮字母消失
     * @author xukai
     * 2015年12月5日
     *
     */
    public class DisapearThread implements Runnable
    {
        public void run()
        {
            // 避免在1.5s内,用户再次拖动时提示框又执行隐藏命令。
        	/**
        	 * SCROLL_STATE_FLING,这个参数表示你手离开后ListView还在“飞”
        	 * SCROLL_STATE_IDLE,这个参数表示ListView停下不动了
        	 * SCROLL_STATE_TOUCH_SCROLL,这个参数表示你手还在ListView上
        	 */
            if (scrollState == ListView.OnScrollListener
            						.SCROLL_STATE_IDLE) {
            	//当ListView滚动停止了,悬浮字母设置不可见
                txtOverlay.setVisibility(View.INVISIBLE);
            }
        }
    }

}

右侧悬浮字母

package com.edu.util;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

/**
 * 右侧字母表,快速定位
 */
public class ContactsRightTool extends View
{
    private String[] b = new String[]{};	//右侧字母表的所有字母

    public void setB(String[] b)
    {
        this.b = b;
    }

    OnTouchingLetterChangedListener onTouchingLetterChangedListener;

    int choose = -1;
    Paint paint = new Paint();
    boolean showBkg = false;

    public ContactsRightTool(Context context, AttributeSet attrs,
    		int defStyle)
    {
        super(context, attrs, defStyle);
    }

    public ContactsRightTool(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public ContactsRightTool(Context context)
    {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);
        if (showBkg) {
            canvas.drawColor(Color.parseColor("#10000000"));
        }
        int height = getHeight();	//悬浮栏高度
        int width = getWidth();		//悬浮栏宽度
        int singleHeight = height / b.length;	//单个字母高度
        // 循环填充字母
        for (int i = 0; i < b.length; i++) {
            paint.setColor(Color.BLACK);
            paint.setTypeface(Typeface.DEFAULT_BOLD);
            //消除锯齿
            paint.setAntiAlias(true);
            if (i == choose) {
            	//第i个字母被选中
            	//改变字体背景色
            	paint.setColor(Color.parseColor("#3399ff"));
                //设置标记,中文仿“粗体”
                paint.setFakeBoldText(true);
            }
            //Text起始X轴位置
            float xPos = width / 2 - paint.measureText(b[i]) / 2;
            //Text起始Y轴位置
            float yPos = singleHeight * i + singleHeight;
            //填充Text
            canvas.drawText(b[i], xPos, yPos, paint);
            paint.reset();
        }

    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event)
    {
        final int action = event.getAction();
        final float y = event.getY();
        final int oldChoose = choose;	//记录上次选择
        final OnTouchingLetterChangedListener listener =
        		onTouchingLetterChangedListener;
        /**
         * y / getHeight() 为整个屏幕的几分之几
         * 再乘以字母数据长度,即为当前字母
         */
        final int c = (int) (y / getHeight() * b.length);  //字母位置

        switch (action) {
            case MotionEvent.ACTION_DOWN:
                showBkg = true;
                if (oldChoose != c && listener != null) {
                    if (c > 0 && c <= b.length) { 
                    	//如果第一个字母是#,无效点击的话,条件变为c>0
                        listener.onTouchingLetterChanged(b[c]);
                        choose = c; //处理重复
                        invalidate();
                    }
                }
                break;
            case MotionEvent.ACTION_MOVE:
            	//按住,移动
                if (oldChoose != c && listener != null) {
                    if (c > 0 && c <= b.length) {  
                    	//如果第一个字母是#,无效点击的话,条件变为c>0
                        listener.onTouchingLetterChanged(b[c]);
                        choose = c;
                        invalidate();
                    }
                }
                break;
            case MotionEvent.ACTION_UP:
            	//还原
                showBkg = false;
                choose = -1;
                invalidate();
                break;
        }
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        return super.onTouchEvent(event);
    }

    /**
     * 设置监听
     */
	public void setOnTouchingLetterChangedListener(
			OnTouchingLetterChangedListener 
			onTouchingLetterChangedListener) {
		this.onTouchingLetterChangedListener =
				onTouchingLetterChangedListener;
	}

	/**
	 * 给右侧悬浮窗添加一个监听接口
	 * @author xukai
	 * 2015年12月5日
	 */
    public interface OnTouchingLetterChangedListener
    {
        public void onTouchingLetterChanged(String s);
    }

}

各种工具类

package com.edu.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

/**
 * 判断字母数字混合<br>
 * 判断字母<br>
 * 判断数字<br>
 * 判断空<br>
 * 汉语拼音转换工具<br>
 * 把单个英文字母或者字符串转换成数字ASCII码<br>
 * @author xukai
 * 2015年12月6日
 *
 */
public class MyUtil {

    /**
     * 判断字母数字混合
     *
     * @param str
     * @return
     */
    public static boolean isAllWord(String str)
    {
        Pattern pattern = Pattern.compile("^[A-Za-z0-9]+$");
        Matcher isNum = pattern.matcher(str);
        if (!isNum.matches()) {
            return false;
        }
        else {
            return true;
        }
    }
    
    /**
     * 判断字母
     * @param str
     * @return
     */
    public static boolean isWord(String str)
    {
        Pattern pattern = Pattern.compile("^[A-Za-z]+$");
        Matcher isNum = pattern.matcher(str);
        if (!isNum.matches()) {
            return false;
        }
        else {
            return true;
        }
    }
    
    /**
     * 判断数字
     * @param str
     * @return
     */
    public static boolean isNumeric(String str)
    {
        Pattern pattern = Pattern.compile("^[0-9]*$");
        Matcher isNum = pattern.matcher(str);
        if (!isNum.matches()) {
            return false;
        }
        else {
            return true;
        }
    }
    
    /**
     * 判断空
     * @param str
     * @return
     */
    public static boolean isEmpty(String str)
    {
        return "".equals(str.trim());
    }
    
    /**
     * 汉语拼音转换工具
     *
     * @param chinese
     * @return
     */
    public static String converterToPinYin(String chinese)
    {
        String pinyinString = "";
        char[] charArray = chinese.toCharArray();
        // 根据需要定制输出格式,我用默认的即可
        HanyuPinyinOutputFormat defaultFormat =
        		new HanyuPinyinOutputFormat();
        try {
            // 遍历数组,ASC码大于128进行转换
            for (int i = 0; i < charArray.length; i++) {
                if (charArray[i] > 128) {
                    // charAt(0)取出首字母
                    if (charArray[i] >= 0x4e00 
                    		&& charArray[i] <= 0x9fa5) {   
                    	//判断是否中文
                        pinyinString += PinyinHelper
                        		.toHanyuPinyinStringArray(
                                charArray[i], defaultFormat)[0].charAt(0);
                    }
                    else {                          
                    	//不是中文的打上未知,所以无法处理韩文日本等等其他文字
                        pinyinString += "?";
                    }
                }
                else {
                    pinyinString += charArray[i];
                }
            }
            return pinyinString;
        }
        catch (BadHanyuPinyinOutputFormatCombination e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 把单个英文字母或者字符串转换成数字ASCII码
     *
     * @param input
     * @return
     */
    public static int character2ASCII(String input)
    {
        char[] temp = input.toCharArray();
        StringBuilder builder = new StringBuilder();
        for (char each : temp) {
            builder.append((int) each);
        }
        String result = builder.toString();
        return Integer.parseInt(result);
    }
	
}
package com.edu.util;

import java.util.Comparator;

/**
 * 混合排序工具
 */
public class MixComparator implements Comparator<String>
{
    public int compare(String o1, String o2)
    {
        // 判断是否为空""
        if (MyUtil.isEmpty(o1) && MyUtil.isEmpty(o2))
            return 0;
        if (MyUtil.isEmpty(o1))
            return -1;
        if (MyUtil.isEmpty(o2))
            return 1;
        String str1 = "";
        String str2 = "";
        try {
            str1 = (o1.toUpperCase()).substring(0, 1);
            str2 = (o2.toUpperCase()).substring(0, 1);
        }
        catch (Exception e) {
            System.out.println("某个str为\" \" 空");
        }
        if (MyUtil.isWord(str1) && MyUtil.isWord(str2)) {               
        	//字母
            return str1.compareTo(str2);
        }
        else if (MyUtil.isNumeric(str1) && MyUtil.isWord(str2)) {     
        	//数字字母
            return 1;
        }
        else if (MyUtil.isNumeric(str2) && MyUtil.isWord(str1)) {
            return -1;
        }
        else if (MyUtil.isNumeric(str1) && MyUtil.isNumeric(str2)) {       
        	//数字数字
            if (Integer.parseInt(str1) > Integer.parseInt(str2)) {
                return 1;
            }
            else {
                return -1;
            }
        }
        else if (MyUtil.isAllWord(str1) && (!MyUtil.isAllWord(str2))) {      
        	//数字字母  其他字符
            return -1;
        }
        else if ((!MyUtil.isAllWord(str1)) && MyUtil.isWord(str2)) {
            return 1;
        }
        else {
            return 1;
        }
    }
    
    
}

发现界面(FindFragment)

find_frag_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/gravy">

    <RelativeLayout 
        android:id="@+id/find_r_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
         android:descendantFocusability="blocksDescendants"
        android:layout_marginTop="20dp">
        <ListView 
            android:id="@+id/r_1_lv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </ListView>
    </RelativeLayout>
    <RelativeLayout 
        android:id="@+id/find_r_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
         android:descendantFocusability="blocksDescendants"
        android:layout_below="@id/find_r_1"
        android:layout_marginTop="20dp">
        <ListView 
            android:id="@+id/r_2_lv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </ListView>
    </RelativeLayout>
    
   	<RelativeLayout 
        android:id="@+id/find_r_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:descendantFocusability="blocksDescendants"
        android:background="@android:color/white"
        android:layout_below="@id/find_r_2"
        android:layout_marginTop="20dp"
        android:orientation="horizontal"
        >
        
        <ListView 
            android:id="@+id/r_3_lv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </ListView>
    </RelativeLayout>
    
 	<RelativeLayout 
        android:id="@+id/find_r_4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
         android:descendantFocusability="blocksDescendants"
        android:layout_below="@id/find_r_3"
        android:layout_marginTop="20dp">
        <ListView 
            android:id="@+id/r_4_lv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </ListView>
    </RelativeLayout>
</RelativeLayout>
Findfragment:

package com.edu.fragment;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.edu.adapter.FragListViewAdapter;
import com.edu.pro1202_weixin.R;

import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

public class FindFragment extends Fragment {

	private List<HashMap<String, String>> list0;
	private List<HashMap<String, String>> list1;
	private List<HashMap<String, String>> list2;
	private List<HashMap<String, String>> list3;
	
	private ListView lv0;
	private ListView lv1;
	private ListView lv2;
	private ListView lv3;
	
	private FragListViewAdapter adapter;
	
	public FindFragment() {
		System.out.println("FindFragment Create!");
	}
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.find_frag_layout, null);
		init(view);	//初始化
		setData();	//添加数据
		//给每个ListView设置适配器
		adapter = new FragListViewAdapter(list0, getActivity());
		lv0.setAdapter(adapter);
		
		adapter = new FragListViewAdapter(list1, getActivity());
		lv1.setAdapter(adapter);
		
		adapter = new FragListViewAdapter(list2, getActivity());
		lv2.setAdapter(adapter);
		
		adapter = new FragListViewAdapter(list3, getActivity());
		lv3.setAdapter(adapter);
		
		return view;
	}
	
	
	private void init(View view) {
		lv0 = (ListView) view.findViewById(R.id.r_1_lv);
		lv1 = (ListView) view.findViewById(R.id.r_2_lv);
		lv2 = (ListView) view.findViewById(R.id.r_3_lv);
		lv3 = (ListView) view.findViewById(R.id.r_4_lv);
	}


	public void setData(){
		list0 = new ArrayList<>();
		list1 = new ArrayList<>();
		list2 = new ArrayList<>();
		list3 = new ArrayList<>();
		
		HashMap<String, String> map = new HashMap<>();
		map.put("info", "朋友圈");
		map.put("image", android.R.drawable.ic_menu_camera+"");
		map.put("rightImage", android.R.drawable.ic_menu_help+"");
		list0.add(map);
		
		map = new HashMap<>();
		map.put("info", "扫一扫");
		map.put("image", android.R.drawable.ic_menu_camera+"");
		list1.add(map);
		map = new HashMap<>();
		map.put("info", "摇一摇");
		map.put("image", android.R.drawable.ic_menu_camera+"");
		list1.add(map);
		
		map = new HashMap<>();
		map.put("info", "附近的人");
		map.put("image", android.R.drawable.ic_menu_camera+"");
		list2.add(map);
		
		map = new HashMap<>();
		map.put("info", "购物");
		map.put("image", android.R.drawable.ic_menu_camera+"");
		list3.add(map);
		map = new HashMap<>();
		map.put("info", "游戏");
		map.put("image", android.R.drawable.ic_menu_camera+"");
		list3.add(map);
		
	}
	
}

我界面

self_frag_layout.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="match_parent"
    android:orientation="vertical"
    android:background="@color/gravy" >
    
    <RelativeLayout 
        android:id="@+id/self_r_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
         android:descendantFocusability="blocksDescendants"
        android:layout_marginTop="20dp">
        <ListView 
            android:id="@+id/self_r_1_lv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </ListView>
    </RelativeLayout>
    <RelativeLayout 
        android:id="@+id/self_r_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
         android:descendantFocusability="blocksDescendants"
        android:layout_below="@id/self_r_1"
        android:layout_marginTop="20dp">
        <ListView 
            android:id="@+id/self_r_2_lv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </ListView>
    </RelativeLayout>
    
   	<RelativeLayout 
        android:id="@+id/self_r_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:descendantFocusability="blocksDescendants"
        android:background="@android:color/white"
        android:layout_below="@id/self_r_2"
        android:layout_marginTop="20dp"
        android:orientation="horizontal"
        >
        
        <ListView 
            android:id="@+id/self_r_3_lv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </ListView>
    </RelativeLayout>
    
 	<RelativeLayout 
        android:id="@+id/self_r_4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
         android:descendantFocusability="blocksDescendants"
        android:layout_below="@id/self_r_3"
        android:layout_marginTop="20dp">
        <ListView 
            android:id="@+id/self_r_4_lv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </ListView>
    </RelativeLayout>
    
 	<RelativeLayout 
        android:id="@+id/self_r_5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
         android:descendantFocusability="blocksDescendants"
        android:layout_below="@id/self_r_4"
        android:layout_marginTop="20dp">
        <ListView 
            android:id="@+id/self_r_5_lv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </ListView>
    </RelativeLayout>
</LinearLayout>
SelfFragment和FindFragment基本相同。

适配器

ViewPagerAdapter

package com.edu.adapter;

import java.util.List;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

/**
 * MainActivity中的ViewPager适配器
 * @author xukai
 * 2015年12月5日
 *
 */
public class ViewPagerAdapter extends FragmentPagerAdapter {

	private List<Fragment> frags;	//所有的Fragment
	
	public ViewPagerAdapter(FragmentManager fm, List<Fragment> frags) {
		super(fm);
		this.frags = frags;
	}

	@Override
	public Fragment getItem(int arg0) {
		return frags.get(arg0);
	}

	@Override
	public int getCount() {
		return frags.size();
	}

}<strong>
</strong>


MainFragAdapter

package com.edu.adapter;

import java.util.HashMap;
import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.edu.pro1202_weixin.R;

/**
 * MainFragment中ListView的适配器
 * @author xukai
 * 2015年12月5日
 */
public class MainFragAdapter extends BaseAdapter {

	private List<HashMap<String, Object>> list;
	private Context context;
	
	public MainFragAdapter(List<HashMap<String, Object>> list,
			Context context) {
		this.context = context;
		this.list = list;
	}
	
	@Override
	public int getCount() {
		return list.size();
	}

	@Override
	public Object getItem(int position) {
		return list.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder holder = null;
		if(convertView == null){
			LayoutInflater inflater = LayoutInflater.from(context);
			convertView = inflater.inflate(R.layout.fram_mian_lv, null);
			
			holder = new ViewHolder();
			holder.iv = (ImageView) convertView
					.findViewById(R.id.lv_layout_image);
			holder.tvName = (TextView) convertView
					.findViewById(R.id.main_tv_name);
			holder.tvMsg = (TextView) convertView
					.findViewById(R.id.main_lv_msg);
			holder.tvTime = (TextView) convertView
					.findViewById(R.id.main_lv_time);

			//设置Tag
			convertView.setTag(holder);
		}else{
			//获取Tag
			holder = (ViewHolder) convertView.getTag();
		}
		HashMap<String, Object> map = list.get(position);
		holder.tvMsg.setText(map.get("name")+"");
		holder.tvTime.setText(map.get("time")+"");
		holder.tvMsg.setText(map.get("message")+"");
		return convertView;
	}

	/**
	 * 内部类:为ListView的Item中的所有组件<br>
	 * 方便使用,不用每次都重新new
	 * @author xukai
	 * 2015年12月5日
	 */
	class ViewHolder{
		ImageView iv;
		TextView tvName;
		TextView tvMsg;
		TextView tvTime;
	}
	
}

FragListViewAdapter

package com.edu.adapter;

import java.util.HashMap;
import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.edu.pro1202_weixin.R;

/**
 * SelfFragment FindFragment 中ListView的适配器
 * @author xukai
 * 2015年12月5日
 *
 */
public class FragListViewAdapter extends BaseAdapter {

	private List<HashMap<String, String>> list; //数据
	private Context context;	//当前Fragment
	
	public FragListViewAdapter(List<HashMap<String, String>> list,
			Context context) {
		this.context = context;
		this.list = list;
	}
	
	@Override
	public int getCount() {
		return list.size();
	}

	@Override
	public Object getItem(int position) {
		return list.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		if(convertView == null){
			//使用XML文件填充convertView
			LayoutInflater inflater = LayoutInflater.from(context);
			convertView = inflater.inflate(R.layout.find_layout_lv, null);
		}
		//获取ListView中的某一项数据
		HashMap<String, String> map = list.get(position);
		//判断是否需要添加右边的ImageView
		if(map.get("rightImage") != null){
			ImageView ivRight = (ImageView) convertView
					.findViewById(R.id.find_layout_iv_right);
			//设置背景图片
			ivRight.setImageDrawable(context.getResources()
					.getDrawable(
							Integer.parseInt(map.get("rightImage")+"")));
		}
		ImageView iv = (ImageView) convertView
				.findViewById(R.id.find_layout_iv);
		TextView tv = (TextView) convertView
				.findViewById(R.id.find_layout_tv);
		tv.setText(map.get("info"));
		iv.setImageDrawable(context.getResources()
				.getDrawable(Integer.parseInt(map.get("image")+"")));
		return convertView;
	}

}


ConstactsListAdapter

package com.edu.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.edu.pro1202_weixin.R;

/**
 * 列表适配器
 */
public class ConstactsListAdapter extends BaseAdapter
{
    private LayoutInflater layoutInflater;
    private OnClickListener onClickListener;
    private String[] stringArr ;	//字母缩写数组
    private Map<String, String> map =
    		new HashMap<String, String>();	//数据

    public ConstactsListAdapter(Context context,
    		String[] arr, OnClickListener listener,
    		Map<String, String> map)
    {
        layoutInflater = LayoutInflater.from(context);
        this.onClickListener = listener;
        stringArr = arr;
        this.map = map;
    }
    
    @Override
    public int getCount()
    {
        return stringArr == null ? 0 : stringArr.length;
    }

    /**
     * 根据stringArr获取Value
     */
    @Override
    public Object getItem(int position)
    {
        if (stringArr != null) {
            String string = map.get(stringArr[position]);
            return string;
        }
        return null;
    }

    @Override
    public long getItemId(int position)
    {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        ViewHolder holder = null;
        if (convertView == null) {
            convertView = layoutInflater
            		.inflate(R.layout.find_list_item, null);
       
            holder = new ViewHolder();
            holder.firstCharHintTextView = (TextView) convertView
                    .findViewById(R.id.text_first_char_hint);
            holder.nameTextView = (TextView) convertView
            		.findViewById(R.id.text_website_name);
            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }
    	holder.nameTextView.setText(map.get(stringArr[position]));
        int idx = position - 1;
        //前一个字符
        char previewChar = idx >= 0 ? stringArr[idx].charAt(0) : ' '; 
        //当前字符
        char currentChar = stringArr[position].charAt(0);            
		if (currentChar != previewChar) { // 如果不相等时显示
			if (isWord(currentChar)) {
				if (position != 0) {
					holder.firstCharHintTextView
						.setVisibility(View.VISIBLE);
				} else {
					holder.firstCharHintTextView
						.setVisibility(View.GONE);
				}
				holder.firstCharHintTextView.setText(String
						.valueOf(currentChar));
			} else {
				if (isWord(previewChar)) {
					holder.firstCharHintTextView
						.setVisibility(View.VISIBLE);
					holder.firstCharHintTextView.setText("*");
				} else {
					holder.firstCharHintTextView.setVisibility(View.GONE);
				}
			}
		} else {
			holder.firstCharHintTextView.setVisibility(View.GONE);
		}
        return convertView;
    }

    public final class ViewHolder
    {
        public TextView firstCharHintTextView;
        public TextView nameTextView;
    }

    /**
     * 判断是否为一个字符<br>
     * 字符 true;非字符 false;
     */
    public boolean isWord(char c)
    {
        Pattern pattern = Pattern.compile("^[A-Za-z]+$");
        Matcher isNum = pattern.matcher(String.valueOf(c));
        if (!isNum.matches()) {
            return false;
        }
        else {
            return true;
        }
    }
}

微信基本页面是实现了,有很多BUG,比如,最后“我界面”进去,然后出来,就会出现错误了,没时间调试了,明天回家,培训终于完了!

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值