2015-02-06 3 views
0

데이터베이스에서 내 listview에 데이터를 읽고 있는데 목록보기의 정보를 볼 수 있습니다. 각 행의 데이터는 왼쪽과 오른쪽으로 나뉩니다. 목록보기에서 스크롤 할 때 항목이 올바르게 uppdating되지 않습니다. 목록보기에서 오른쪽에있는 일부 항목은 왼쪽으로 이동하고 다른 방향으로 이동합니다. 아주 나쁜 해결책 인 getView() 바로 아래에 convertView = null을 설정하여이 문제를 해결할 수 있습니다! 문제를 올바르게 해결하는 방법?안드로이드,보기 소유자가 목록보기를 올바르게 업데이트하지 않습니다.

코드 링크 :

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 가지 유형의 레이아웃이 있으므로 2를 반환해야합니다.

+0

고맙습니다. 이것은 수정 솔루션입니다. 나는 이전 문제를 디버깅 한 후에 값을 변경하는 것을 잊어 버렸다고 믿을 수 없다. 이런 종류의 문제로 시간을내어 주셔서 실례합니다. – user2407226

+0

올바른 해결책이라고 생각한다면 대답으로 표시하십시오. – NinjaCoder

+0

나는 충분한 평판이 없다;) – user2407226

관련 문제