2015-02-06 47 views
0

我正在从数据库中读取数据到我的列表视图中,我可以看到列表视图中的信息,每行中的数据分为左侧和右侧。当我在列表视图中滚动项目不正确uppdating。列表视图右侧的某些项目正在向左侧移动,而另一侧则移至左侧。 我可以通过直接在getView()下设置convertView = null来解决这个问题,这是一个非常糟糕的解决方案!如何正确解决问题?Android,查看持有人不正确更新列表视图

代码链接:

XML “http://pastebin.com/rCbeBS6E

ChatFragment “http://pastebin.com/xMFCm62s

public class ChatAdapter extends ArrayAdapter<Message> { 

private ArrayList<Message> lstMessages; 
private LayoutInflater layoutInflater; 

public ChatAdapter(Context context, ArrayList<Message> messages) { 
    super(context, 0, messages); 
    this.lstMessages = messages; 
    layoutInflater = LayoutInflater.from(getContext()); 
} 

public int IsMsgFromMe(Message message) { 
    boolean isSenderMe = ChatFragment.username.equals(message.GetFrom()); 
    if (isSenderMe) { 
     return 0; 
    } 
    return 1; 
} 

@Override 
public Message getItem(int position) { 
    return lstMessages.get(position); 
} 

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

//Number of layouts 
@Override 
public int getViewTypeCount() { 
    return 1; 
} 

@Override 
public int getItemViewType(int position) { 
    Message message = lstMessages.get(position); 
    int sender = IsMsgFromMe(message); 
    return sender; 
} 

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

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

    //Warning very bas solution!!!! 
    convertView = null; //Make it possible to scroll without loading data over an already existing view. 
    int sender = getItemViewType(position); 

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

     //Check who has sent the message me or someone else... 
     switch(sender) { 
      case 0: 
       convertView = layoutInflater.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); 
       break; 
      case 1: 
       convertView = layoutInflater.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); 
       break; 
     } 
     convertView.setTag(holder); 

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

    // Get the data item for this position 
    Message message = lstMessages.get(position); 

    // 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; 
} 

}

回答

1

试试这个。

getViewTypeCount()应该返回2因为您有两种类型的布局。

+0

Thanx这是一个纠正解决方案。我无法相信,在调试早期问题后,我忘记了将价值改回来,请原谅我在这类问题上占用你的时间。 – user2407226 2015-02-06 15:12:59

+0

如果您觉得这是一个正确的解决方案,请将其标记为答案:) – NinjaCoder 2015-02-06 16:41:12

+0

我没有足够的声望;) – user2407226 2015-02-07 17:09:01