Android中ListView的自定义显示:
package com.android.huawei.message;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Color;
import android.provider.ContactsContract;
import android.provider.ContactsContract.PhoneLookup;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MessageListView extends ListView implements ListView.OnScrollListener{
public MessageListView(Context context) {
super(context);
// TODO Auto-generated constructor stub
initList();
}
public MessageListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
initList();
}
private Cursor mCursor;
LinearLayout m_LinearLayout;
ListView m_ListView;
private int mCount;
// 从数据库的NAME和NUMBER两列中取数据
String[] mCursorCols = new String[] { PhoneLookup.DISPLAY_NAME, PhoneLookup._ID };
private int getMessageCount(){
mCursor = getContext().getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI, mCursorCols, null, null,
null);
if (mCursor == null || mCursor.getCount() == 0){
return 0;
}
return mCursor.getCount();
}
/** Called when the activity is first created. */
private void initList(){
Log.i("harvey", "0");
// /* 创建LinearLayout布局对象 */
// m_LinearLayout = new LinearLayout(this);
// /* 设置布局LinearLayout的属性 */
// m_LinearLayout.setOrientation(LinearLayout.VERTICAL);
// m_LinearLayout.setBackgroundColor(android.graphics.Color.BLACK);
//
// /* 创建ListView对象 */
// m_ListView = new ListView(this);
// LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
// m_ListView.setBackgroundColor(Color.BLACK);
//
// /* 添加m_ListView到m_LinearLayout布局 */
// m_LinearLayout.addView(m_ListView, param);
//
// /* 设置显示m_LinearLayout布局 */
// setContentView(m_LinearLayout);
// 获取数据库Phones的Cursor // 数据库的Cursor对象
mCursor = getContext().getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI, mCursorCols, null, null,
null);
// startManagingCursor(mCursor);
mCursor.moveToNext();
String Message = mCursor.getString(0);
String IDNumber = mCursor.getString(1);
Log.i("harvey", "###### 11111111 ###### Message === " + Message);
Log.i("harvey", "###### 22222222 ###### IDNumber === " + IDNumber);
// // ListAdapter是ListView和后台数据的桥梁
// ListAdapter adapter = new SimpleCursorAdapter(this,
// // 定义List中每一行的显示模板
// // 表示每一行包含两个数据项
// android.R.layout.simple_list_item_2, mCursor, mCursorCols,
// // 与NAME和NUMBER对应的Views
// new int[] { android.R.id.text1, android.R.id.text2 });
// setAdapter(adapter);
Log.i("harvey", "1");
/* 将adapter添加到m_ListView中 */
mCount = getMessageCount();
Log.i("harvey", "mCount ====== " + mCount);
if (0 != mCount){
Log.i("harvey", "2");
setAdapter(new MessageListAdapter(getContext()));
}
Log.i("harvey", "3");
/* 为m_ListView视图添加setOnItemSelectedListener监听 */
setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{
DisplayToast("滚动到第"+Long.toString(arg0.getSelectedItemId())+"项");
}
public void onNothingSelected(AdapterView<?> arg0)
{
//没有选中
}
});
/* 为m_ListView视图添加setOnItemClickListener监听 */
setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{
//于对选中的项进行处理
DisplayToast("选中了第"+Integer.toString(arg2+1)+"项");
}
});
}
/* 显示Toast */
public void DisplayToast(String str)
{
// Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
}
//follow code add by yanghang 20100901
private class MessageListAdapter extends BaseAdapter {
private Context mContext;
public MessageListAdapter(Context context) {
mContext = context;
}
public int getCount() {
return getMessageCount();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
MessageListItem messageListItem;
if (convertView == null) {
messageListItem = new MessageListItem(mContext, position);
} else {
messageListItem = (MessageListItem) convertView;
}
Log.i("harvey", "########## getView #############");
mCursor.moveToPosition(position);
// Bitmap bitmap = getBitmapFromDB(mCursor);
String Message = mCursor.getString(0);
String IDNumber = mCursor.getString(1);
Log.i("harvey", "###### 33333333 ###### Message === " + Message);
Log.i("harvey", "###### 44444444 ###### IDNumber === " + IDNumber);
messageListItem.mMessageText.setText(Message);
messageListItem.mMessageNumber.setText(IDNumber);
messageListItem.mMessageText.setTag(null);
return messageListItem;
}
}
private class MessageListItem extends LinearLayout {
private TextView mMessageText;
private TextView mMessageNumber;
public MessageListItem(Context context, int position) {
super(context);
// TODO Auto-generated constructor stub
Log.i("harvey", "########## MessageListItem #############");
LinearLayout rightLinearLayout = new LinearLayout(context);
rightLinearLayout.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams rightLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
// 此处判断是收件还是发件然后调整坐标
mCursor.moveToPosition(position);
String idNumber = mCursor.getString(1);
if(Integer.parseInt(idNumber)%2==0){
rightLinearLayout.setBackgroundResource(R.drawable.receive);
// rightLinearLayout.setGravity(Gravity.LEFT);
rightLayoutParams.setMargins(0, 0, 0, 0);
}else{
rightLinearLayout.setBackgroundResource(R.drawable.send);
// rightLinearLayout.setGravity(Gravity.RIGHT);
rightLayoutParams.setMargins(170, 0, 0, 0);
}
this.addView(rightLinearLayout, rightLayoutParams);
// this.addView(rightLinearLayout, rightLayoutParams);
LinearLayout.LayoutParams titleLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
mMessageText = new TextView(context);
if(Integer.parseInt(idNumber)%2==0){
mMessageText.setGravity(Gravity.LEFT);
}else{
mMessageText.setGravity(Gravity.RIGHT);
}
// mTitleTextView.setGravity(Gravity.LEFT);
mMessageText.setSelected(true);
mMessageText.setPadding(8, 10, 8, 0);
mMessageText.setTextSize(16);
mMessageText.setTextColor(Color.BLACK);
mMessageText.setSingleLine(true);
rightLinearLayout.addView(mMessageText, titleLayoutParams);
LinearLayout.LayoutParams timeLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
timeLayoutParams.setMargins(0, 4, 0, 0);
mMessageNumber = new TextView(context);
if(Integer.parseInt(idNumber)%2==0){
mMessageNumber.setGravity(Gravity.LEFT);
}else{
mMessageNumber.setGravity(Gravity.RIGHT);
}
mMessageNumber.setPadding(60, 20, 60, 0);
mMessageNumber.setTextSize(16);
mMessageNumber.setTextColor(Color.BLACK);
mMessageNumber.setSingleLine(true);
rightLinearLayout.addView(mMessageNumber, timeLayoutParams);
}
}
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
}
}
res的main文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<com.android.huawei.message.MessageListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
manifest文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.huawei.message"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".messageTest"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
</manifest>