Android学QQ聊天列表展示ListView
稍微修改下实现的,比完全copy感觉爽多了
布局文件: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"
tools:context=".MainActivity">
<ListView
android:id="@+id/list_content"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
展示视图控制文件:MainActivity
package run.yang.com.listviewqqsaydemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private static final int TYPE_BOOK = 0;
private static final int TYPE_APP = 1;
private ListView list_content;
private ArrayList<Object> mData = null;
private MutiLayoutAdapter myAdapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//数据准备:
mData = new ArrayList<Object>();
for(int i = 0;i < 20;i++){
switch ((int)(Math.random() * 2)){
case TYPE_BOOK:
mData.add(new Book("把括号里面的删掉",R.mipmap.qq2));
break;
case TYPE_APP:
mData.add(new App(R.mipmap.qq1,"能不能不删除啊"));
break;
}
}
list_content = (ListView) findViewById(R.id.list_content);
myAdapter = new MutiLayoutAdapter(MainActivity.this,mData);
list_content.setAdapter(myAdapter);
}
}
写个Book.java,当作聊天对象一
package run.yang.com.listviewqqsaydemo;
/**
* Created by yang_zzheng on 2016/7/15
* yangzhizheng2012@163.com
*/
public class Book {
private String bName;
private int bIcon;
public Book() {
}
public Book(String bName, int bIcon) {
this.bName = bName;
this.bIcon = bIcon;
}
public String getbName() {
return bName;
}
public int getbIcon() {
return bIcon;
}
public void setbName(String bName) {
this.bName = bName;
}
public void setbIcon(int bIcon) {
this.bIcon = bIcon;
}
}
写个App.java,当作聊天对象二
package run.yang.com.listviewqqsaydemo;
/**
* Created by yang_zzheng on 2016/7/15
* yangzhizheng2012@163.com
*/
public class App {
private int aIcon;
private String aName;
public App() {
}
public App(int aIcon, String aName) {
this.aIcon = aIcon;
this.aName = aName;
}
public int getaIcon() {
return aIcon;
}
public String getaName() {
return aName;
}
public void setaIcon(int aIcon) {
this.aIcon = aIcon;
}
public void setaName(String aName) {
this.aName = aName;
}
}
自定义的BaseAdapter—->MutiLayoutAdapter.java
package run.yang.com.listviewqqsaydemo;
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 java.util.ArrayList;
/**
* Created by yang_zzheng on 2016/7/15
* yangzhizheng2012@163.com
*/
public class MutiLayoutAdapter extends BaseAdapter {
//定义两个类别标志
private static final int TYPE_BOOK = 0;
private static final int TYPE_APP = 1;
private Context mContext;
private ArrayList<Object> mData = null;
public MutiLayoutAdapter(Context mContext,ArrayList<Object> mData) {
this.mContext = mContext;
this.mData = mData;
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
//多布局的核心,通过这个判断类别
@Override
public int getItemViewType(int position) {
if (mData.get(position) instanceof App) {
return TYPE_APP;
} else if (mData.get(position) instanceof Book) {
return TYPE_BOOK;
} else {
return super.getItemViewType(position);
}
}
//类别数目
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
ViewHolder1 holder1 = null;
ViewHolder2 holder2 = null;
if(convertView == null){
switch (type){
case TYPE_APP:
holder1 = new ViewHolder1();
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_one, parent, false);
holder1.img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
holder1.txt_aname = (TextView) convertView.findViewById(R.id.txt_aname);
convertView.setTag(R.id.Tag_APP,holder1);
break;
case TYPE_BOOK:
holder2 = new ViewHolder2();
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_two, parent, false);
holder2.txt_bname = (TextView) convertView.findViewById(R.id.txt_bname);
holder2.img_bicon = (ImageView) convertView.findViewById(R.id.img_bicon);
convertView.setTag(R.id.Tag_Book,holder2);
break;
}
}else{
switch (type){
case TYPE_APP:
holder1 = (ViewHolder1) convertView.getTag(R.id.Tag_APP);
break;
case TYPE_BOOK:
holder2 = (ViewHolder2) convertView.getTag(R.id.Tag_Book);
break;
}
}
Object obj = mData.get(position);
//设置下控件的值
switch (type){
case TYPE_APP:
App app = (App) obj;
if(app != null){
holder1.img_icon.setImageResource(app.getaIcon());
holder1.txt_aname.setText(app.getaName());
}
break;
case TYPE_BOOK:
Book book = (Book) obj;
if(book != null){
holder2.txt_bname.setText(book.getbName());
holder2.img_bicon.setImageResource(book.getbIcon());
}
break;
}
return convertView;
}
//两个不同的ViewHolder
private static class ViewHolder1{
ImageView img_icon;
TextView txt_aname;
}
private static class ViewHolder2{
TextView txt_bname;
ImageView img_bicon;
}
}
当然少不了我们的列表项目布局item_one.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="horizontal"
android:padding="5dp">
<ImageView
android:id="@+id/img_icon"
android:layout_width="64dp"
android:layout_height="64dp"
android:src="@mipmap/qq1" />
<TextView
android:id="@+id/txt_aname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="20dp"
android:text="百度"
android:textSize="20sp" />
</LinearLayout>
当然少不了我们的列表项目布局item_two.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="horizontal"
android:gravity="right"
android:padding="10dp">
<TextView
android:id="@+id/txt_bname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="《第一行代码Android》"
android:textColor="#F3684A"
android:textSize="18sp" />
<ImageView
android:id="@+id/img_bicon"
android:layout_width="64dp"
android:layout_height="64dp"
android:src="@mipmap/qq2" />
</LinearLayout>
这里还用了资源文件strings.xml
<resources>
<string name="app_name">ListViewQQSayDemo</string>
<string name="action_settings">Settings</string>
<item name="Tag_APP" type="id"></item>
<item name="Tag_Book" type="id"></item>
</resources>
又学到点知识
本文参考文献:
http://blog.youkuaiyun.com/coder_pig/article/details/48681667