简体   繁体   English

RecyclerView onCreateViewHolder未调用

[英]RecyclerView onCreateViewHolder not called

RecyclerView setAdapter do but calling method ChatAdapter, registerAdapterDataObserver, onAttachedToRecyclerView, getItemCount 5 calling RecyclerView setAdapter可以,但是调用方法ChatAdapter,registerAdapterDataObserver,onAttachedToRecyclerView,getItemCount 5调用

xml layout_height is match_parent xml layout_heightmatch_parent

getItemCount is 5 not null , but onCreateViewHolder is not called. getItemCount5不为null ,但不调用onCreateViewHolder

MyActivity.java: 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: 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? 为什么不调用onCreateViewHolder

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: 然后您先通过Activity或Fragment获取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()));

Hope this will solve your problem. 希望这能解决您的问题。

You didn't notify your adapter after setting the value. 设置该值后,您没有通知适配器。 While you setting the adapter messages is empty. 设置适配器messages为空。 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() . 使用addAll(message_objects)messages添加值时,这些数据将添加到ArrayList但是您必须使用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 . 在类级别声明适配器,然后在recyclerview中设置适配器之前创建适配器对象,并在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();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 RecyclerView onCreateViewHolder未被调用 - RecyclerView onCreateViewHolder not being called RecyclerVIew onCreateViewHolder 和 onBindViewHolder 没有被调用 - RecyclerVIew onCreateViewHolder and onBindViewHolder is not called 在notifyItemRangeInserted之后未调用RecyclerView onCreateViewHolder - RecyclerView onCreateViewHolder not called after notifyItemRangeInserted Recyclerview onCreateViewHolder调用了每个项目 - Recyclerview onCreateViewHolder called for every item 什么时候调用onCreateViewHolder,为什么? 回收站视图 - When is onCreateViewHolder called and why? RecyclerView Android Kotlin RecyclerView 适配器 onCreateViewHolder 未调用 - Android Kotlin RecyclerView Adapter onCreateViewHolder no called RecyclerView中没有调用适配器的onCreateViewHolder和onBindViewHolder方法? - Adapter onCreateViewHolder and onBindViewHolder methods are not getting called in RecyclerView? 调用 getItemCount 时 RecyclerView 未调用 onCreateViewHolder 方法 - RecyclerView is not calling onCreateViewHolder method while getItemCount is called Recyclerview - 为每个列表项调用 onCreateViewHolder - Recyclerview - onCreateViewHolder called for each list item 垂直recyclerview中的水平RecyclerView不起作用,从未调用过onCreateViewHolder - horizontal RecyclerView inside a vertical recyclerview is not working, onCreateViewHolder never called
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM