Android - 自定义适配器,GetView 位置未正确递增
Android - Custom adapter, GetView position is not incrementing correctly
我的自定义适配器包含一个 getView 方法并且 getView 的位置没有递增 correctly.The 副作用是所有值都显示在两种布局中 (row_chat_me & row_chat_others)。
IsMsgFromMe 正确识别消息的作者是谁 (message.GetFrom())。 chatMsgList 是一个包含 Message 对象的 ArrayList。
谢谢!
public class ChatAdapter extends ArrayAdapter<Message> {
public ChatAdapter(Context context, ArrayList<Message> messages) {
super(context, 0, messages);
}
public boolean IsMsgFromMe(Message message) {
boolean isSenderMe = ChatFragment.username.equals(message.GetFrom());
return isSenderMe;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
// Get the data item for this position
Message message = ChatFragment.chatMsgList.get(position);
if (convertView == null) {
holder = new ViewHolder();
//Check who has sent the message me or someone else...
if (IsMsgFromMe(message)) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.row_chat_me, parent, false);
holder.chatFrom = (TextView) convertView.findViewById(R.id.txt_message_me_from);
holder.chatMessage = (TextView) convertView.findViewById(R.id.txt_message_me_message);
holder.chatTime = (TextView) convertView.findViewById(R.id.txt_message_me_time);
} else {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.row_chat_others, parent, false);
holder.chatFrom = (TextView) convertView.findViewById(R.id.txt_message_others_from);
holder.chatMessage = (TextView) convertView.findViewById(R.id.txt_message_others_message);
holder.chatTime = (TextView) convertView.findViewById(R.id.txt_message_others_time);
}
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// Populate the data into the template view using the data object
holder.chatFrom.setText("From: " + message.GetFrom());
holder.chatMessage.setText(message.GetMsg());
holder.chatTime.setText("Date: " + message.GetTime());
// Return the completed view to render on screen
return convertView;
}
public static class ViewHolder {
public TextView chatFrom;
public TextView chatMessage;
public TextView chatTime;
}
}
我的建议是使用传递给适配器的消息列表,而不是从 ChatFragment
中引用列表。所以我会像这样修改适配器代码:
public class ChatAdapter extends ArrayAdapter<Message> {
private ArrayList<Message> messages;
public ChatAdapter(Context context, ArrayList<Message> messages) {
super(context, 0, messages);
this.messages = messages;
}
...
除非你的 2 个聊天行有不同的背景,或者 2 个聊天行之间有其他一些主要区别,我认为你只需要一个行布局。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
// Get the data item for this position
Message message = messages.get(position);
if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(getContext()).inflate(R.layout.row_chat, parent, false);
holder.chatFrom = (TextView) convertView.findViewById(R.id.txt_message_from);
holder.chatMessage = (TextView) convertView.findViewById(R.id.txt_message_message);
holder.chatTime = (TextView) convertView.findViewById(R.id.txt_message_time);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// Populate the data into the template view using the data object
holder.chatFrom.setText("From: " + message.GetFrom());
holder.chatMessage.setText(message.GetMsg());
holder.chatTime.setText("Date: " + message.GetTime());
// Return the completed view to render on screen
return convertView;
}
单行布局示例:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/txt_message_time"
android:layout_width="fill_parent"
android:layout_height="25dp"/>
<TextView
android:id="@+id/txt_message_from"
android:layout_width="fill_parent"
android:layout_height="25dp"
android:layout_below="@+id/txt_message_time" />
<TextView
android:id="@+id/txt_message_message"
android:layout_width="fill_parent"
android:layout_below="@+id/txt_message_from"
android:layout_height="50dp" />
</RelativeLayout>
希望对您有所帮助。
正如您上面的代码,在 getView() 中,当 convertView!=null 时,convertView 可能是从 R.layout.row_chat_me 而不是 R.layout.row_chat_others(和 .
因此,您应该覆盖 getItemType() 和 getViewTypeCount() 以在适配器中定义 2(或更多)项目视图类型。
您可以在此处阅读更多详细信息:http://android.amberfog.com/?p=296(部分不同的列表项布局)
我的自定义适配器包含一个 getView 方法并且 getView 的位置没有递增 correctly.The 副作用是所有值都显示在两种布局中 (row_chat_me & row_chat_others)。 IsMsgFromMe 正确识别消息的作者是谁 (message.GetFrom())。 chatMsgList 是一个包含 Message 对象的 ArrayList。
谢谢!
public class ChatAdapter extends ArrayAdapter<Message> {
public ChatAdapter(Context context, ArrayList<Message> messages) {
super(context, 0, messages);
}
public boolean IsMsgFromMe(Message message) {
boolean isSenderMe = ChatFragment.username.equals(message.GetFrom());
return isSenderMe;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
// Get the data item for this position
Message message = ChatFragment.chatMsgList.get(position);
if (convertView == null) {
holder = new ViewHolder();
//Check who has sent the message me or someone else...
if (IsMsgFromMe(message)) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.row_chat_me, parent, false);
holder.chatFrom = (TextView) convertView.findViewById(R.id.txt_message_me_from);
holder.chatMessage = (TextView) convertView.findViewById(R.id.txt_message_me_message);
holder.chatTime = (TextView) convertView.findViewById(R.id.txt_message_me_time);
} else {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.row_chat_others, parent, false);
holder.chatFrom = (TextView) convertView.findViewById(R.id.txt_message_others_from);
holder.chatMessage = (TextView) convertView.findViewById(R.id.txt_message_others_message);
holder.chatTime = (TextView) convertView.findViewById(R.id.txt_message_others_time);
}
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// Populate the data into the template view using the data object
holder.chatFrom.setText("From: " + message.GetFrom());
holder.chatMessage.setText(message.GetMsg());
holder.chatTime.setText("Date: " + message.GetTime());
// Return the completed view to render on screen
return convertView;
}
public static class ViewHolder {
public TextView chatFrom;
public TextView chatMessage;
public TextView chatTime;
}
}
我的建议是使用传递给适配器的消息列表,而不是从 ChatFragment
中引用列表。所以我会像这样修改适配器代码:
public class ChatAdapter extends ArrayAdapter<Message> {
private ArrayList<Message> messages;
public ChatAdapter(Context context, ArrayList<Message> messages) {
super(context, 0, messages);
this.messages = messages;
}
...
除非你的 2 个聊天行有不同的背景,或者 2 个聊天行之间有其他一些主要区别,我认为你只需要一个行布局。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
// Get the data item for this position
Message message = messages.get(position);
if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(getContext()).inflate(R.layout.row_chat, parent, false);
holder.chatFrom = (TextView) convertView.findViewById(R.id.txt_message_from);
holder.chatMessage = (TextView) convertView.findViewById(R.id.txt_message_message);
holder.chatTime = (TextView) convertView.findViewById(R.id.txt_message_time);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// Populate the data into the template view using the data object
holder.chatFrom.setText("From: " + message.GetFrom());
holder.chatMessage.setText(message.GetMsg());
holder.chatTime.setText("Date: " + message.GetTime());
// Return the completed view to render on screen
return convertView;
}
单行布局示例:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/txt_message_time"
android:layout_width="fill_parent"
android:layout_height="25dp"/>
<TextView
android:id="@+id/txt_message_from"
android:layout_width="fill_parent"
android:layout_height="25dp"
android:layout_below="@+id/txt_message_time" />
<TextView
android:id="@+id/txt_message_message"
android:layout_width="fill_parent"
android:layout_below="@+id/txt_message_from"
android:layout_height="50dp" />
</RelativeLayout>
希望对您有所帮助。
正如您上面的代码,在 getView() 中,当 convertView!=null 时,convertView 可能是从 R.layout.row_chat_me 而不是 R.layout.row_chat_others(和 .
因此,您应该覆盖 getItemType() 和 getViewTypeCount() 以在适配器中定义 2(或更多)项目视图类型。
您可以在此处阅读更多详细信息:http://android.amberfog.com/?p=296(部分不同的列表项布局)