【问题标题】:RecyclerView onCreateViewHolder not called未调用 RecyclerView onCreateViewHolder
【发布时间】:2018-05-23 18:43:15
【问题描述】:

RecyclerView setAdapter 做但调用方法 ChatAdapter、registerAdapterDataObserver、onAttachedToRecyclerView、getItemCount 5 调用

xml layout_heightmatch_parent

getItemCount5 不是 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

【问题讨论】:

  • 请粘贴整个 Adapter.java 类,这段代码不够用。
  • 抱歉我正在编辑
  • @나상혁 你是否在 messages 中添加了值,然后调用了 notifyDataSetChanged() 到该适配器。

标签: android android-recyclerview android-adapter


【解决方案1】:

我刚刚更新了您的适配器代码,它运行良好。

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

而你的 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()));

希望这能解决您的问题。

【讨论】:

    【解决方案2】:

    设置值后您没有通知您的适配器。在您设置适配器时,messages 为空。当您使用addAll(message_objects)messages 中添加值时,这些数据将添加到ArrayList,但您必须使用notifyDataSetChanged() 通知适配器。在类级别声明您的适配器,然后在 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-07
      • 2023-03-17
      • 2017-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      相关资源
      最近更新 更多