八:基於xmpp的smack去獲取好友列表並用ExpandableListView顯示

      本篇來獲取好友列表。爲了像QQ一樣,點擊展開好友列表,所以用了ExpandableListView。


1、先來看一下效果,



2、先寫佈局文件,activity_linkman.xml裏面拖了一個ExpandableListView

<?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:background="@drawable/catalogopen" >

    <TextView
        android:id="@+id/tv_username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="20sp"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/tv_presence"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/tv_username"
        android:layout_alignBottom="@+id/tv_username"
        android:layout_marginLeft="22dp"
        android:layout_toRightOf="@+id/tv_username" />

    <TextView
        android:id="@+id/tv_friends"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/tv_username"
        android:layout_below="@+id/tv_presence"
        android:paddingTop="10sp"
        android:paddingBottom="5sp"
        android:text="@string/tv_friends"
        android:textSize="20sp" />

    <ExpandableListView
        android:id="@+id/elv_linkman"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/tv_friends" >

    </ExpandableListView>

</RelativeLayout>

3、strings.xml裏的代碼:

<!-- 聯繫人 -->
    <string name="tv_friends">好友</string>
    <string name="imageDescription">group indicator</string>
    <string name="headxiang">頭像</string>
    <string name="tv_friendName">廖伍星</string>
    <string name="tv_sign">sorry,我忘了我想說什麼了。</string>

4、LinkmanActivity.java類,先獲取組和好友,獲取組和好友還是看smack文檔,再把它們放到ExpandableListView中,這個組件和listView差不多,同樣是拖一個ExpandableListView控件,一看就明白了。

package org.hkby.lwx.activity;

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

import org.hkby.lwx.adapter.AllEntryExpandableAdapter;
import org.hkby.lwx.common.XmppTool;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterGroup;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.TextView;
/**
 * linkman
 * @author liaowuxing
 *
 */
public class LinkmanActivity extends Activity {
	/**
	 * called when this activity is first create
	 */
	private ExpandableListView elv_linkman;
	private List<String> groutList;
	private List<List<String>> childList;
	private TextView tv_username;
	private TextView tv_presence;
	private String account;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_linkman);
		SharedPreferences sp = getSharedPreferences("username",
				Activity.MODE_PRIVATE);
		account = sp.getString("account", "");
		initView();
		initClick();
		getData();
	}

	public void initView() {
		elv_linkman = (ExpandableListView) this.findViewById(R.id.elv_linkman);
		//not set group indicator
		elv_linkman.setGroupIndicator(null);
		//login account
		tv_username = (TextView) this.findViewById(R.id.tv_username);
		tv_username.setText(account);
		//TODO Online status
		tv_presence = (TextView) this.findViewById(R.id.tv_presence);
		tv_presence.setText("在線");
	}

	public void initClick() {
		elv_linkman.setOnChildClickListener(new OnChildClickListener() {
			
			@Override
			public boolean onChildClick(ExpandableListView parent, View v,
					int groupPosition, int childPosition, long id) {
				Intent intent = new Intent(LinkmanActivity.this,
						ChatActivity.class);
				Bundle bundle = new Bundle();
				String username = childList.get(groupPosition).get(childPosition);
				bundle.putString("name", username);
				intent.putExtra("b_name", bundle);
				startActivity(intent);
				return true;
			}
		});
	}

	/**
	 * get all friends and set in the adapter
	 */
	public void getData() {
		groutList = new ArrayList<String>();
		childList = new ArrayList<List<String>>();
		
		Roster roster = XmppTool.getConnection().getRoster();
		Collection<RosterGroup> entriesGroup = roster.getGroups();
		for (RosterGroup group : entriesGroup) {
			Collection<RosterEntry> entries = group.getEntries();
			groutList.add(group.getName());
			List<String> tempList = new ArrayList<String>();
			for (RosterEntry entry : entries) {
				tempList.add(entry.getName());
			}
			childList.add(tempList);
		}
		AllEntryExpandableAdapter adapter = new AllEntryExpandableAdapter(groutList, childList, LinkmanActivity.this);
		elv_linkman.setAdapter(adapter);
		adapter.notifyDataSetChanged();
	}
	
	@Override
	public void onBackPressed() {
		super.onBackPressed();
		if (XmppTool.getConnection() != null) {
			XmppTool.closeConnection();
		}
	}
}

5、我們需要在建一個包,來專門放adapter,命名爲:org.hkby.lwx.adapter,再建一個類AllEntryExpandableAdapter。

package org.hkby.lwx.adapter;

import java.util.List;

import org.hkby.lwx.activity.R;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;
/**
 * ExpandableListView's adapter
 * @author liaowuxing
 *
 */
public class AllEntryExpandableAdapter extends BaseExpandableListAdapter {
	private List<String> groupList;
	private List<List<String>> childList;
	private Context context;
	private LayoutInflater mInflater;
	public AllEntryExpandableAdapter(List<String> groupList,
			List<List<String>> childList, Context context) {
		super();
		this.groupList = groupList;
		this.childList = childList;
		this.context = context;
		mInflater = LayoutInflater.from(context);
	}

	@Override
	public int getGroupCount() {
		return groupList.size();
	}

	@Override
	public int getChildrenCount(int groupPosition) {
		return childList.get(groupPosition).size();
	}

	@Override
	public Object getGroup(int groupPosition) {
		return groupList.get(groupPosition);
	}

	@Override
	public Object getChild(int groupPosition, int childPosition) {
		return childList.get(groupPosition).get(childPosition);
	}

	@Override
	public long getGroupId(int groupPosition) {
		return groupPosition;
	}

	@Override
	public long getChildId(int groupPosition, int childPosition) {
		return childPosition;
	}

	@Override
	public boolean hasStableIds() {
		return true;
	}

	@Override
	public View getGroupView(int groupPosition, boolean isExpanded,
			View convertView, ViewGroup parent) {
		if (convertView == null) {
			GroupViewHolder groupViewHolder = new GroupViewHolder();
			convertView = mInflater.inflate(R.layout.group_item, null);
			groupViewHolder.tv_groupName = (TextView)convertView.findViewById(R.id.tv_group);
			groupViewHolder.im_icon = (ImageView)convertView.findViewById(R.id.im_icon);
			convertView.setTag(groupViewHolder);
		}
		GroupViewHolder gHolder = (GroupViewHolder) convertView.getTag();
		String groupName = groupList.get(groupPosition);
		if (groupName != null) {
			gHolder.tv_groupName.setText(groupName);
		}else {
			gHolder.tv_groupName.setText("");
		}
		if (isExpanded) {
			gHolder.im_icon.setBackgroundResource(R.drawable.icon2);
		}else {
			gHolder.im_icon.setBackgroundResource(R.drawable.icon);
		}
		return convertView;
	}

	@Override
	public View getChildView(int groupPosition, int childPosition,
			boolean isLastChild, View convertView, ViewGroup parent) {
		if (convertView == null) {
			ChildViewHolder cViewHolder = new ChildViewHolder();
			convertView = mInflater.inflate(R.layout.child_item, null);
			cViewHolder.tv_childName = (TextView)convertView.findViewById(R.id.tv_childName);
			convertView.setTag(cViewHolder);
		}
		ChildViewHolder cHolder = (ChildViewHolder)convertView.getTag();
		String childName = childList.get(groupPosition).get(childPosition);
		if (childName != null) {
			cHolder.tv_childName.setText(childName);
		}else {
			cHolder.tv_childName.setText("");
		}
		return convertView;
	}

	@Override
	public boolean isChildSelectable(int groupPosition, int childPosition) {
		return true;
	}

	private class GroupViewHolder{
		private TextView tv_groupName;
		private ImageView im_icon;
	}
	private class ChildViewHolder{
		private TextView tv_childName;
	}
}

6、怎麼樣,不難吧,group和child分的很明顯,listView是一個佈局,它需要兩個佈局,一個是父佈局,一個子佈局,

父佈局代碼:

<?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:background="@drawable/catalogtopbg"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/tv_group"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="55dp"
        android:textSize="24sp" />

    <ImageView
        android:id="@+id/im_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="20dp"
        android:contentDescription="@string/imageDescription" />

</RelativeLayout>

子佈局代碼:

<?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" >

    <ImageView
        android:id="@+id/im_headIcon"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:contentDescription="@string/headxiang"
        android:layout_marginLeft="42dp"
        android:layout_marginTop="5sp"
        android:src="@drawable/headxiang" />

    <TextView
        android:id="@+id/tv_childName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/im_headIcon"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@+id/im_headIcon"
        android:textStyle="bold"
        android:text="@string/tv_friendName"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/tv_childName"
        android:layout_below="@+id/tv_childName"
        android:text="@string/tv_sign" />

</RelativeLayout>


7、最後,來看工程結構圖:


8、ok,好友列表完成,下一篇寫聊天。





發佈了16 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章