简体   繁体   中英

RecyclerView onCreateViewHolder not called

RecyclerView setAdapter do but calling method ChatAdapter, registerAdapterDataObserver, onAttachedToRecyclerView, getItemCount 5 calling

xml layout_height is match_parent

getItemCount is 5 not null , but onCreateViewHolder is not called.

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();
}

Why is onCreateViewHolder not called?

I just update your Adapter code and its working well.

    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();
    }
}

And you Activity or Fragment first get the RecyclerView and then set adapter like this:

 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()));

Hope this will solve your problem.

You didn't notify your adapter after setting the value. While you setting the adapter messages is empty. When you adding the value in messages using addAll(message_objects) those data are added in ArrayList but you have to notify the adapter using notifyDataSetChanged() . Declare your adapter in class level then create object of adapter before setting the adapter in recyclerview and notify the adapter after you added objects in 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();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM