RecyclerView onCreateViewHolder не вызывается - PullRequest
0 голосов
/ 23 мая 2018

RecyclerView setAdapter делает, но вызывает метод ChatAdapter, registerAdapterDataObserver, onAttachedToRecyclerView, getItemCount 5 вызывает

xml layout_height это match_parent

getItemCount это 5 не null,но onCreateViewHolder не вызывается.

MyActivity.java:

List<ChatMessage> messages = new ArrayList<ChatMessage>();
LinearLayoutManager layoutManager =  new LinearLayoutManager(getApplicationContext());

reyclerview_message_list.setAdapter(new ChatAdapter(messages, R.layout.chat_send));
reyclerview_message_list.setLayoutManager(new LinearLayoutManager(this));
reyclerview_message_list.setItemAnimator(new DefaultItemAnimator());
reyclerview_message_list.addItemDecoration(new DividerItemDecoration(getApplicationContext(), layoutManager.getOrientation()));

Adapter.java:

public class ChatAdapter extends RecyclerView.Adapter<ChatAdapter.ViewHolder> {

private List<ChatMessage> itemList;
private int itemLayout;


public ChatAdapter(List<ChatMessage> items, int itemLayout){
    this.itemList = items;
    this.itemLayout = itemLayout;

}


@Override
public ChatAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    View view  = LayoutInflater.from(viewGroup.getContext()).inflate(itemLayout, viewGroup, false);
    return new ChatAdapter.ViewHolder(view);
}

@Override
public void onBindViewHolder(ChatAdapter.ViewHolder viewholder, int position) {

    ChatMessage item  = itemList.get(position);
    viewholder.messageBody.setText(item.getMessageBody());
    viewholder.messageTime.setText(item.getMessageTime());
    viewholder.messageState.setText(item.getMessageState());
    viewholder.itemView.setTag(item);
}



public class ViewHolder extends RecyclerView.ViewHolder {

    public TextView messageBody, messageTime, messageState;

    public ViewHolder(View itemView) {
        super(itemView);

        messageBody = (TextView)itemView.findViewById(R.id.text_message_body);
        messageTime= (TextView)itemView.findViewById(R.id.text_message_time);
        messageState= (TextView)itemView.findViewById(R.id.text_message_state);
    }
}

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

Почему onCreateViewHolder не вызывается?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Вы не уведомили свой адаптер после установки значения.При настройке адаптера messages пусто.Когда вы добавляете значение в messages, используя addAll(message_objects), эти данные добавляются в ArrayList, но вы должны уведомить адаптер, используя notifyDataSetChanged().Объявите свой адаптер на уровне класса, затем создайте объект адаптера перед настройкой адаптера в представлении реселлера и уведомите адаптер после добавления объектов в ArrayList.

private ChatAdapter chatAdapter;//declare it globally(class level)

chatAdapter = new ChatAdapter(messages, R.layout.chat_send);
reyclerview_message_list.setAdapter(chatAdapter);
reyclerview_message_list.setLayoutManager(new LinearLayoutManager(this));
reyclerview_message_list.setItemAnimator(new DefaultItemAnimator());
reyclerview_message_list.addItemDecoration(new DividerItemDecoration(getApplicationContext(), layoutManager.getOrientation()));
messages.addAll(ChatMessage_Objects_you_getting_from_web_service);
chatAdapter.notifyDataSetChanged();
0 голосов
/ 24 мая 2018

Я просто обновляю код вашего адаптера, и он хорошо работает.

    public class ChatAdapter extends RecyclerView.Adapter<ChatAdapter.ViewHolder> {

    private List<ChatMessage> itemList;
    private int itemLayout;
    private Context mContext;

    public ChatAdapter(List<ChatMessage> items, int itemLayout, Context context){
        this.itemList = items;
        this.itemLayout = itemLayout;
        this.mContext = context;
    }


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        View view  = LayoutInflater.from(mContext).inflate(itemLayout, viewGroup, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder viewholder, int position) {

        ChatMessage item  = itemList.get(position);
        viewholder.messageBody.setText(item.getMessageBody());
        viewholder.messageTime.setText(item.getMessageTime());
        viewholder.messageState.setText(item.getMessageState());
        viewholder.itemView.setTag(item);
    }



    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView messageBody, messageTime, messageState;

        public ViewHolder(View itemView) {
            super(itemView);

            messageBody = (TextView)itemView.findViewById(R.id.text_message_body);
            messageTime= (TextView)itemView.findViewById(R.id.text_message_time);
            messageState= (TextView)itemView.findViewById(R.id.text_message_state);
        }
    }

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

И вы сначала получаете активность или фрагмент, а затем получаете RecyclerView, а затем настраиваете адаптер следующим образом:

 RecyclerView reyclerview_message_list = findViewById(R.id.recyclerView);

    reyclerview_message_list.setAdapter(new ChatAdapter(messages, R.layout.list_row, this)); // passed another parameter Context
    reyclerview_message_list.setLayoutManager(new LinearLayoutManager(this));
    reyclerview_message_list.setItemAnimator(new DefaultItemAnimator());
    reyclerview_message_list.addItemDecoration(new DividerItemDecoration(getApplicationContext(), layoutManager.getOrientation()));

Надеюсь, эторешит вашу проблему.

...