2016-08-30 2 views
0

У меня есть RecycleView, который содержит список сообщений, которые я хочу использовать привязку данных Android для заполнения текста и времени каждой строки моего Recycleview, но у меня есть странная проблема, которая после привязки сообщение для каждой строки, TextView текста и времени заполнения пустым текстом, например, вы не задаете никакого текста!привязка данных Android не работает корректно на Recycle View

мой RecyceView адаптер:

@Override 
public BaseRVHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    layoutInflater=LayoutInflater.from(parent.getContext()); 
    viewGroup=parent; 
    View view= layoutInflater.inflate(layout[viewType], null); 
    try { 
     return holder.getConstructor(View.class,LayoutInflater.class,ViewGroup.class,Context.class).newInstance(view,layoutInflater,viewGroup,context); 
    } catch (InstantiationException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (NoSuchMethodException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

public Object getItem(int position){ 
    if(position<items.size()) 
     return items.get(position); 
    return null; 
} 

@Override 
public void onBindViewHolder(BaseRVHolder holder, int position) { 
    if(holder!=null) 
     holder.fill(context,layoutInflater,viewGroup,items.get(position),position,getItemViewType(position),getObjects()); 

} 
@Override 
     public int getItemViewType(int position) { 
      if(messages.get(position).getFrom() == homeId){ 
       return 1; 
      } 
      return 0; 
     } 

и заполнить() метод моего ViewHolder сообщения:

@Override 
    public void fill(final Context context, LayoutInflater layoutInflater, ViewGroup viewGroup, final Message message, int pos, int viewType, Object... objects) { 
     if(viewType==0) { 
      AdapterMessageSendActivitytBinding binding = AdapterMessageSendActivitytBinding.inflate(this.inflater); 
      binding.setMessage(message); 
      binding.notifyChange(); 
      binding.invalidateAll(); 
     }else { 
      AdapterMessageReceiveActivityBinding binding =AdapterMessageReceiveActivityBinding.inflate(this.inflater); 
      binding.setMessage(message); 
     } 
    } 

Message.java:

public class Message extends BaseModel implements Serializable{ 

@PrimaryKey(autoincrement = true) 
private int id; 
@Column 
private int from; 
@Column 
private String username; 
@Column 
private String text; 
@Column 
transient DateTime dateTime; 

private List<ToMessage> recipients; 

//getter and setters are here... 

и расположение адаптера:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
    <data> 
     <variable 
      name="message" 
      type="com.example.familydesk.model.Message"></variable> 
    </data> 
    <LinearLayout 
     android:orientation="horizontal" 
     android:padding="5dp" 

     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <ImageView android:layout_width="56dp" android:layout_height="56dp" 
      android:src="@drawable/house_logo"/> 
     <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" 
      android:background="@drawable/chat_back_white_nine_patch" 
      android:layout_marginRight="10dp" 
      android:orientation="vertical"> 
      <TextView android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:id="@+id/contentTv" 
       android:text="@{message.text}" 
       android:gravity="right"/> 
      <TextView android:layout_width="match_parent" android:layout_height="wrap_content" 
       android:text="@{message.dateTime.toString()}" 
       android:gravity="right" 
       android:id="@+id/time_dateTv" 
       android:layout_marginTop="5dp" 
       android:singleLine="true"/> 
     </LinearLayout> 

    </LinearLayout> 
</layout> 

Что не так с моим кодом? Может ли кто-нибудь помочь плз?

+0

Я думаю, что ваша реализация recyclerview слишком сложна. обратитесь к [this] (http://www.androidhive.info/2016/01/android-working-with-recycler-view/). – Nikhil

ответ

0

создания связывания объекта в конструкторе ViewHolder, как показано ниже:

public BaseRVHolder(View view){ 
    binding = DataBindingUtil.bind(view); 
} 

и не забудьте позвонить executePendingBindings() после установки значения.

binding.setMessage(message); 
binding.executePendingBindings(); 

см. this учебное пособие для получения дополнительной информации.

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