0

Привет, ребята, я создаю приложение для чата, похожее на whatsapp, но сталкивающееся с проблемой с Childs Visibilties в RecyclerView. Здесь оно содержит мое сообщение и сообщение с сервера. Я определил два элемента сообщения для моего сообщения и сервера в единый макет, и я устанавливаю видимость на основе логического; но детали не отображается правильноПроблема с RecyclerView с дочерними элементами Визуальности

адаптер Класс:

public class MessageDetailsListAdapter extends RecyclerView.Adapter<MessageDetailsListAdapter.MessageViewHolder> { 

private List<MessageModel> messagesList; 
private Activity activityContext; 
public MessageDetailsListAdapter(List<MessageModel> messagesList,Activity activityContext) { 
    this.messagesList = messagesList; 
    this.activityContext = activityContext; 
} 


@Override 
public int getItemCount() { 
    return messagesList.size(); 
} 

@Override 
public void onBindViewHolder(MessageViewHolder messageViewHolder, final int i) { 
    final MessageModel msg = messagesList.get(i); 
    if(msg.getIsMessageSentbyMe()) 
    { 
     messageViewHolder.card_linear.setVisibility(View.GONE); 
     messageViewHolder.messageTextMe.setText(msg.getMsgText()); 
     messageViewHolder.userNameMe.setText(msg.getSenderName()); 
     messageViewHolder.timeStampMe.setText(msg.getSentTime()); 
     messageViewHolder.card_linearMe.setOnLongClickListener(new OnLongClickListener() { 

      @Override 
      public boolean onLongClick(View v) { 
       // TODO Auto-generated method stub 
       Intent intent = new Intent(activityContext.getString(R.string.brMessageDetailsDeleteItem)); 
       intent.putExtra("deletePosition", i); 
       activityContext.sendBroadcast(intent); 
       return false; 
      } 
     }); 
    } 
    else 
    { 
     messageViewHolder.card_linearMe.setVisibility(View.GONE); 
     messageViewHolder.messageText.setText(msg.getMsgText()); 
     messageViewHolder.userName.setText(msg.getSenderName()); 
     messageViewHolder.timeStamp.setText(msg.getSentTime()); 
     messageViewHolder.card_linear.setOnLongClickListener(new OnLongClickListener() { 

      @Override 
      public boolean onLongClick(View v) { 
       // TODO Auto-generated method stub 
       Intent intent = new Intent(activityContext.getString(R.string.brMessageDetailsDeleteItem)); 
       intent.putExtra("deletePosition", i); 
       activityContext.sendBroadcast(intent); 
       return false; 
      } 
     }); 
    } 
} 

@Override 
public MessageViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View itemView = LayoutInflater.from(viewGroup.getContext()) 
       .inflate(R.layout.messagedetail_listitem, viewGroup,false); 


     return new MessageDetailsListAdapter.MessageViewHolder(itemView); 
} 

public static class MessageViewHolder extends RecyclerView.ViewHolder { 



    public LinearLayout card_linear,card_linearMe; 
    public TextView userName,messageText,timeStamp,userNameMe,messageTextMe,timeStampMe; 
    public MessageViewHolder(View v) { 
     super(v); 
     card_linear = (LinearLayout) v.findViewById(R.id.card_linear); 
     card_linearMe = (LinearLayout) v.findViewById(R.id.card_linearMe); 
     userName = (TextView) v.findViewById(R.id.userName); 
     messageText = (TextView) v.findViewById(R.id.messageText); 
     timeStamp = (TextView) v.findViewById(R.id.timeStamp); 
     userNameMe = (TextView) v.findViewById(R.id.userNameMe); 
     messageTextMe = (TextView) v.findViewById(R.id.messageTextMe); 
     timeStampMe = (TextView) v.findViewById(R.id.timeStampMe); 
    } 
} 

public void add(MessageModel messageModel) { 
    // TODO Auto-generated method stub 
    messagesList.add(messageModel); 
    notifyItemInserted(messagesList.size()); 
} 

    public void addAll(Collection<MessageModel> messages) 
    { 
    messagesList.clear(); 
    messagesList.addAll(messagesList); 
    notifyDataSetChanged(); 
    } 
public void remove(MessageModel mDelete) { 
    // TODO Auto-generated method stub 
    messagesList.remove(mDelete); 
    notifyDataSetChanged(); 
} 
    } 

messagedetail_listitem.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" 
android:paddingTop="@dimen/message_detail_padding_top" > 

<LinearLayout 
    android:id="@+id/card_linear" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="@dimen/card_liner_margin_left" 
    android:layout_marginRight="@dimen/card_liner_margin_right" 
    android:background="@drawable/message_holder_white" 
    android:orientation="vertical" 
    android:padding="@dimen/card_linear_padding" > 

    <TextView 
     android:id="@+id/userName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Me" 
     android:paddingLeft="@dimen/card_linear_padding" 
     style="@style/MessageUserNameFont" 
     /> 

    <TextView 
     android:id="@+id/messageText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="@dimen/message_text_margin_top" 
     android:paddingBottom="@dimen/message_text_padding" 
     android:paddingLeft="@dimen/message_text_padding" 
     android:paddingTop="@dimen/message_text_padding" 
     style="@style/MessageTextFont" 
     android:text="hii fdsfdsfsdf sdf dsf sdfs" 
     /> 

    <TextView 
     android:id="@+id/timeStamp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="right" 
     android:layout_marginRight="@dimen/time_stamp_margin_right" 
     android:gravity="right" 
     android:text="22:20" 
     style="@style/MessageTextFont" 
    /> 
</LinearLayout> 
<LinearLayout 
    android:id="@+id/card_linearMe" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="@dimen/card_linearme_margin_left" 
    android:layout_marginRight="@dimen/card_linearme_margin_right" 
    android:background="@drawable/message_holder_blue" 
    android:orientation="vertical" 
    android:padding="@dimen/card_linearme_padding" > 

    <TextView 
     android:id="@+id/userNameMe" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Me" 
     android:textColor="@android:color/white" /> 

    <TextView 
     android:id="@+id/messageTextMe" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="@dimen/message_text_margin_top" 
     android:paddingBottom="@dimen/message_text_padding" 
     android:paddingRight="@dimen/message_text_padding" 
     android:paddingTop="@dimen/message_text_padding" 
     android:text="hii" 
     android:textColor="@android:color/white" /> 

    <TextView 
     android:id="@+id/timeStampMe" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="right" 
     android:layout_marginRight="@dimen/time_stamp_margin_right" 
     android:gravity="right" 
     android:text="22:20" 
     android:textColor="@android:color/white" /> 
</LinearLayout> 

ответ

4

Важно понимать здесь является то, что владельцы могут просматривать повторно.

Во-первых, у вас есть это условие:

if(msg.getIsMessageSentbyMe()) 
{ 
    messageViewHolder.card_linear.setVisibility(View.GONE); 
    ... 
} 

, а затем у вас есть:

else 
{ 
    messageViewHolder.card_linearMe.setVisibility(View.GONE); 
} 

Теперь представьте себе, в первый раз вы используете ваш VH и сообщение (например), отправленных тобой. Вы эффективно скрыли card_linear.

Скажите, что держатель вида теперь должен быть повторно использован для сообщения, которое НЕ отправлено вами. Вы также уменьшите видимость card_linearMe.

Что случилось с вашим VH, так это то, что оба макета невидимы после такого сценария. Чтобы это исправить, добавьте следующие строки:

if(msg.getIsMessageSentbyMe()) 
{ 
    messageViewHolder.card_linear.setVisibility(View.GONE); 
    messageViewHolder.card_linearMe.setVisibility(View.VISIBLE); 
    ... 
} 
else 
{ 
    messageViewHolder.card_linear.setVisibility(View.VISIBLE); 
    messageViewHolder.card_linearMe.setVisibility(View.GONE); 
} 
+0

Я такой дурак всегда делать такие глупые ошибки – sainath

+1

@sainath нечего расстраиваться. Происходит к лучшему из нас :). – kha

+0

@kha Ницца человек решения +1 –

Смежные вопросы