Android编程实战——仿微信群聊-5——Android端UI-多种显示的ListView
项目源代码移步github
Android端的界面应该不难,有一个难点就是对话的显示,这需要一个显示多种内容的ListView,这里就要用到BaseAdapter了。BaseAdapter是一个抽象类,我们需要自己实现它的内容,所以BaseAdapter的自由度会很高。
MyAdapter:
public class MyAdapter extends BaseAdapter {
private Context context;
private LayoutInflater layoutInflater;
private final int VIEW_TYPE =3 ;
//显示的3种方式
private final int TYPE_1 = 0;
private final int TYPE_2 = 1;
private final int TYPE_3 = 2;
public MyAdapter(Context context) {
this.context = context;
layoutInflater = LayoutInflater.from(context);
}
@Override
public int getItemViewType(int position) {
return type.get(position);
}
@Override
public int getViewTypeCount() {
return VIEW_TYPE;
}
@Override
public int getCount() {
return name.size();
}
@Override
public Object getItem(int position) {
return name.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
String userName;
if (convertView == null) {
switch (type) {
case TYPE_1:
convertView = layoutInflater.inflate(R.layout.list_layout_text, parent, false);
userName = name.get(position);
LinearLayout llColorBlock = (LinearLayout) convertView.findViewById(R.id.llColorBlock);
TextView tvUserName1 = (TextView) convertView.findViewById(R.id.tvUserName);
TextView tvText = (TextView) convertView.findViewById(R.id.tvText);
tvUserName1.setText( userName + ":");
tvText.setText(text.get(position));
if (userName.equals(user.getUserName())) {
llColorBlock.setBackgroundColor(getResources().getColor(R.color.green));
}
break;
case TYPE_2:
convertView = layoutInflater.inflate(R.layout.list_layout_voice,parent,false);
userName = name.get(position);
TextView tvUserName2 = (TextView) convertView.findViewById(R.id.tvUserName);
TextView tvTime = (TextView) convertView.findViewById(R.id.tvTime);
tvUserName2.setText(name.get(position) + ":");
tvTime.setText(String.valueOf(Math.round(time.get(position))) + " ''");
Button btVoice = (Button) convertView.findViewById(R.id.btVoice);
if (userName.equals(user.getUserName())) {
tvTime.setTextColor(getResources().getColor(R.color.green));
}
btVoice.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (audioPresenter.isPlaying()) {
audioPresenter.stopPlay();
}else {
System.out.println("file" + filePath.get(position));
audioPresenter.palyAudio(filePath.get(position));
}
}
});
break;
case TYPE_3:
convertView = layoutInflater.inflate(R.layout.list_layout_server,parent,false);
TextView tvServer = (TextView) convertView.findViewById(R.id.tvServer);
tvServer.setText(text.get(position));
break;
}
}
return convertView;
}
}
里面最重要的方法就是getView了,View在这个方法里面绘制并返回,根据类型来使用相应的布局显示数据,并且可以初始化数据,设置事件监听器。这里3种显示的布局分别为,文本消息,语音消息,服务器消息。是3种不同的显示。