2015-02-02 3 views
0

Мой пользовательский адаптер содержит метод getView, а позиция getView не увеличивается правильно. Побочные эффекты - это то, что все значения представлены в обеих макетах (row_chat_me row_chat_others). IsMsgFromMe правильно определяет, кто автор сообщения (message.GetFrom()). chatMsgList - это объект ArrayList, содержащий объекты Message.Android - Пользовательский адаптер, позиция GetView не увеличивается правильно

Спасибо!

public class ChatAdapter extends ArrayAdapter<Message> { 
public ChatAdapter(Context context, ArrayList<Message> messages) { 
    super(context, 0, messages); 
} 

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    ViewHolder holder = null; 

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

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

     //Check who has sent the message me or someone else... 
     if (IsMsgFromMe(message)) { 

      convertView = LayoutInflater.from(getContext()).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); 

     } else { 

      convertView = LayoutInflater.from(getContext()).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); 

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

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

}

ответ

0

Как ваш код выше, в GetView(), когда convertView! = NULL, возможно convertView был раздут из R.layout.row_chat_me вместо R.layout.row_chat_others (и.

Таким образом, вы должны переопределить GetItemType() и getViewTypeCount() для определения 2 (или более) типа представления элемента в адаптере

Более подробно вы можете прочитать здесь:. (макеты Части Различных элементов списка) http://android.amberfog.com/?p=296

+0

Привет, я реализовал это решение, но, к сожалению, проблема остается прежней. Вот как я его реализовал http://pastebin.com/tSqtz4aJ – user2407226

+0

@ user2407226 Я думаю, вы должны удалить notifyDataSetChanged(); в getView (...). Если он все еще не работает, пожалуйста, покажите мне Logcat или более подробную информацию об этой проблеме (я не совсем понимаю, что «позиция не увеличивается правильно»). – VAdaihiep

+0

Теперь я нашел решение своего вопроса, но, к сожалению, у меня есть некоторые проблемы при прокрутке списка, и мое решение для этой проблемы работает, но это ужасное решение и уничтожает цель из шаблона Holder. Я напишу новый вопрос о stackoverflow, чтобы избежать путаницы в будущем, «http://stackoverflow.com/questions/28356606/android-view-holder-does-not-update-listview-correctly» Решение заключалось в том, чтобы удалить второй список и создать левую и правую стороны в строке. См. Код "http://pastebin.com/6WSjQAbs", "http://pastebin.com/xMFCm62s", "http://pastebin.com/rCbeBS6E". – user2407226

0

Мое предложение состоит в том, что вы используете список сообщений, переданных в адаптер вместо ссылки список из ChatFragment. Поэтому я хотел бы изменить код адаптера, как это:

public class ChatAdapter extends ArrayAdapter<Message> { 

private ArrayList<Message> messages; 

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

... 

Если у вас есть различные фоны для 2-х строк чата или есть какая-то другая основная разница между 2 рядами чата, я думаю, вам нужен только один макет строки.

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    ViewHolder holder = null; 

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

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

     convertView = LayoutInflater.from(getContext()).inflate(R.layout.row_chat, parent, false); 

     holder.chatFrom = (TextView) convertView.findViewById(R.id.txt_message_from); 
     holder.chatMessage = (TextView) convertView.findViewById(R.id.txt_message_message); 
     holder.chatTime = (TextView) convertView.findViewById(R.id.txt_message_time); 

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

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

Пример одного макета строки:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:id="@+id/txt_message_time" 
     android:layout_width="fill_parent" 
     android:layout_height="25dp"/> 

    <TextView 
     android:id="@+id/txt_message_from" 
     android:layout_width="fill_parent" 
     android:layout_height="25dp" 
     android:layout_below="@+id/txt_message_time" /> 

    <TextView 
     android:id="@+id/txt_message_message" 
     android:layout_width="fill_parent" 
     android:layout_below="@+id/txt_message_from" 
     android:layout_height="50dp" /> 

</RelativeLayout> 

Я надеюсь, что это помогает.

+0

, к сожалению, это решение было не заставляйте его работать, но вы h ave a point ... Спасибо за помощь ... – user2407226

+0

Не могли бы вы разместить свои макеты 'row_chat_me' и' row_chat_others'? – iRuth

+0

Вот код xml http://pastebin.com/aBR64G7h. И вот обновленный код для ChatAdapter pastebin.com/tSqtz4aJ – user2407226