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(部分不同的列表项布局)