android Listview在滚动时重复数据

android Listview在滚动时重复数据,android,listview,Android,Listview,我有listview和BaseAdapter这是我的适配器代码 public class MessageAdapter1 extends BaseAdapter { Context context; private int auth; private List<MessageList> mMessages; private LayoutInflater mInflater; public MessageAdapter1(Context context, List<Me

我有
listview
BaseAdapter
这是我的适配器代码

public class MessageAdapter1 extends BaseAdapter {

Context context;
private int auth;
private List<MessageList> mMessages;
private LayoutInflater mInflater;




public MessageAdapter1(Context context, List<MessageList> messages) { 
    this.mMessages = messages;
    this.context = context;

    this.session = new SessionManager(context);
    mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    auth     = session.getUserId();

}



@Override
public int getItemViewType(int position) {
    int type = -1;
    String m = mMessages.get(position).getType();
    int user_idx = mMessages.get(position).getUser_id();


    if(auth != user_idx && m.equals("message"))         type = 1;
    else if(auth == user_idx && m.equals("message"))    type = 0;
    else if(auth != user_idx && m.equals("image"))      type = 3;
    else if(auth == user_idx && m.equals("image"))      type = 4;
    //other else if and types .....
return type;
}

@Override
public int getViewTypeCount() {
    return 19;
}

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

@Override
public Object getItem(int i) {
    return mMessages.get(i);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    int type = getItemViewType(position);

    if (convertView == null) {
        holder = new ViewHolder();
        switch (type) {



                case MessageList.TYPE_MESSAGE_RIGHT:
                    convertView = mInflater.inflate(R.layout.right_message, null);
                    holder.groupMessage = (LinearLayout)convertView.findViewById(R.id.messages);

                    break;
                case MessageList.TYPE_MESSAGE_LEFT:
                    convertView = mInflater.inflate(R.layout.left_message, null);
                    holder.groupMessage = (LinearLayout)convertView.findViewById(R.id.messages);
                    break;
                case MessageList.TYPE_ACTION:
                    convertView = mInflater.inflate(R.layout.typing, null);
                    holder.Indicator = (AVLoadingIndicatorView)convertView.findViewById(R.id.indicator);

                   break;
                   //other case break for other types ..




        }

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder)convertView.getTag();
    }

            setMessage(holder,position);


    return convertView;
}

private void setMessage(ViewHolder holder, int position){
    MessageList m = mMessages.get(position);

   //holder.groupMessage.add ... data





}


public static class ViewHolder {
    private LinearLayout groupMessage;
    private AVLoadingIndicatorView Indicator;
    //more here other
}
}
我看到我的代码是正确的,但为什么在滚动时重复或重新排序项目
ListView

由于项目视图似乎会根据列表中项目的类型而改变,因此无法缓存视图持有者

尝试删除
if(convertView==null){
和附带的
else{
语句。

我现在尝试:)等待我的最终结果
`getViewTypeCount` and `getItemViewType` and other solution not helped me