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

时间:2014-01-13 20:54:56

标签: android listview scroll chat baseadapter

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

问题是,当我滚动列表查看上部项目时,其他人会感到不安,就像某个地方自己的msg位于右侧而某些地方位于左侧。

滚动前

   Friend
           Me
   Friend
           Me
   Friend
           Me

滚动后

   Friend
   Me
           Friend
           Me
   Friend
   Me
           Friend
   Me

这是我的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;
}

1 个答案:

答案 0 :(得分: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
 }