滚动时ListView项目位置切换和干扰

Pun*_*nit 2 android listview scroll chat baseadapter

我正在使用ListView和BaseAdapter来填充里面的列表项.我只是在一个简单的聊天应用程序自己的消息显示在右侧和朋友消息显示在左侧.

问题是,当我滚动列表以查看上部项目时,其余的会受到干扰,例如某个地方自己的msg位于右侧,而某些位于左侧.

在滚动之前

   Friend
           Me
   Friend
           Me
   Friend
           Me
Run Code Online (Sandbox Code Playgroud)

滚动后

   Friend
   Me
           Friend
           Me
   Friend
   Me
           Friend
   Me
Run Code Online (Sandbox Code Playgroud)

这是我的BaseAdapter代码

    @Override
public View getView(int position, View convertView, ViewGroup parent) {
    View rowView = convertView;
    if (rowView == null) {
        LayoutInflater inflater = LayoutInflater.from(context);
        if (names.get(position).equals(own)){
            rowView = inflater.inflate(R.layout.list_item_chat_message_own,
                    null);}
        else{
            rowView = inflater.inflate(
                    R.layout.list_item_chat_message_contact, null);

        }
        ViewHolder viewHolder = new ViewHolder();
        viewHolder.name = (TextView) rowView.findViewById(R.id.name);
        viewHolder.message=(TextView) rowView.findViewById(R.id.firstLine);
        rowView.setTag(viewHolder);
    }

    ViewHolder holder = (ViewHolder) rowView.getTag();
    String name = names.get(position);
    String message = messages.get(position);
    //Log.e("name", own+"-"+name);
    //Log.e("message", message);
    holder.message.setTextColor(context.getResources().getColor(this.getTextColorID()));

    if(name.equals(own))
        holder.name.setText("Me");
    else
        holder.name.setText(name);
    holder.message.setText(message);

    return rowView;
}

    @Override
public int getCount() {
    return names.size();
}

@Override
public Object getItem(int position) {
    return names.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}
Run Code Online (Sandbox Code Playgroud)

Hel*_*boy 5

您必须在适配器中实现getItemViewType(position)和getViewTypeCount方法.

第一个告诉适配器需要在给定位置使用哪种类型的行,第二个告诉适配器需要使用多少行类型

更新:

它会是这样的:

@Override
public int getViewTypeCount() {
    // you have two different row types
    return 2;
}

@Override
public int getItemViewType(int position) {
    // You need to tell to adapter which row is needed at given position
    return names.get(position).equals(own) ? 0 : 1;
}

public View getView(int position, View convertView, ViewGroup parent) {
    View rowView = convertView;
    if (rowView == null) {
        LayoutInflater inflater = LayoutInflater.from(context);
        if (getItemViewType(position) == 0){
            rowView = inflater.inflate(R.layout.list_item_chat_message_own,
                null);}
        else{
            rowView = inflater.inflate(
                R.layout.list_item_chat_message_contact, null);

        }
        // rest of your code
     }
     //rest of your code
 }
Run Code Online (Sandbox Code Playgroud)