notifyDataSetChanged()无法与recyclerview一起使用

时间:2018-07-18 07:21:50

标签: android android-recyclerview

我在一项活动中正在使用Recyclerview,但无法在recyclerView中显示任何数据。

anonymous()

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="56dp" android:background="@color/colorPrimary" android:id="@+id/toolBar"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_back_light" android:layout_gravity="center" android:layout_marginStart="16dp"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Sushi" android:textColor="@color/white" android:textStyle="bold" android:layout_gravity="center" android:layout_marginStart="12dp" android:textSize="18sp"/> </LinearLayout> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/chatMessages" android:clipToPadding="false" android:paddingBottom="4dp" android:paddingTop="4dp" android:layout_below="@+id/toolBar" android:layout_above="@+id/messageInputView"/> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:paddingStart="12dp" android:paddingEnd="12dp" android:id="@+id/messageInputView"> <View android:layout_width="match_parent" android:layout_height="1dp" android:paddingStart="12dp" android:paddingEnd="12dp" android:background="#D9D9D9" android:id="@+id/border" android:layout_alignParentTop="true"/> <EditText android:id="@+id/messageInput" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:background="@color/transparent" android:layout_toLeftOf="@+id/messageSendButton" android:hint="Type a message..." android:textColorHint="#80282a2b" android:inputType="textAutoCorrect|textAutoComplete|textMultiLine|textCapSentences"/> <ImageView android:id="@+id/messageSendButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_centerVertical="true" android:src="@drawable/ic_send" android:onClick="onClick" android:padding="4dp" android:layout_marginTop="12dp" android:layout_marginBottom="12dp" android:background="@drawable/send_message_background"/> </RelativeLayout> </RelativeLayout> 的所有回调方法都不会在调用RecyclerView.Adapter<RecyclerView.ViewHolder>时调用。

此处是适配器代码:

notifydatasetchanged()

用于初始化recyclerView的代码:

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

    private static String TAG = "ChatMessagesAdapter";
    private ArrayList<ChatMessages> mChatMessages;
    private Context mContext;

    public ChatMessagesAdapter(ArrayList<ChatMessages> chatMessages, Context context){
        mContext = context.getApplicationContext();
        mChatMessages = chatMessages;
        Log.d("ChatActivity Adapter", String.valueOf(mChatMessages.size()));
        setHasStableIds(true);
    }

    public synchronized void refreshData(ArrayList<ChatMessages> feeds){
        Log.d("ChatActivity Adapter", String.valueOf(feeds.size()));
        mChatMessages.clear();
        mChatMessages.addAll(feeds);
        Log.d("ChatActivity Adapter", String.valueOf(mChatMessages.size()));
        notifyDataSetChanged();
    }

    class IncomingMessageHolder extends RecyclerView.ViewHolder {

        @BindView(R.id.messageText) TextView mMessageText;
        @BindView(R.id.messageTime) TextView mMessageTime;

        IncomingMessageHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this,itemView);
        }
    }

    class OutgoingMessageHolder extends RecyclerView.ViewHolder {

        @BindView(R.id.messageText) TextView mMessageText;
        @BindView(R.id.messageTime) TextView mMessageTime;

        OutgoingMessageHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this,itemView);
        }

    }

    @Override
    public int getItemViewType(int position) {
        Log.d("ChatActivity Adapter","getItemViewType "+mChatMessages.get(position).getMessageStatus());
        if (mChatMessages.get(position).getMessageStatus() == 2){
            return 1;
        } else {
            return 0;
        }
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Log.d("ChatActivity Adapter","onCreateViewHolder");
        switch (viewType){
            case 0 :
                View outgoingMessageView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_outcoming_text_message,parent,false);
                return new OutgoingMessageHolder(outgoingMessageView);
            default :
                View incomingMessageView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_incoming_text_message, parent, false);
                return new IncomingMessageHolder(incomingMessageView);
        }
    }

    @Override
    public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position) {
        Log.d("ChatActivity Adapter","onBindViewHolder");
        switch (holder.getItemViewType()){
            case 0:
                OutgoingMessageHolder outgoingMessageHolder = (OutgoingMessageHolder) holder;
                outgoingMessageHolder.mMessageText.setText(mChatMessages.get(position).getMessage());
                outgoingMessageHolder.mMessageTime.setText(
                        UtilsFuntions.getDurationString(mChatMessages.get(position).getTimeStamp())
                );
                break;
            case 1:
                IncomingMessageHolder incomingMessageHolder = (IncomingMessageHolder) holder;
                incomingMessageHolder.mMessageText.setText(mChatMessages.get(position).getMessage());
                incomingMessageHolder.mMessageTime.setText(
                        UtilsFuntions.getDurationString(mChatMessages.get(position).getTimeStamp())
                );
                break;
        }
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getItemCount() {
        Log.d("ChatActivity Adapter", String.valueOf(mChatMessages.size()));
        return mChatMessages.size();
    }

}

但是,甚至当我触摸recyclerview或尝试滚动recyclerview时,所有调用的回调都将被填充,并且recyclerview被填充。我不知道为什么会这样。请帮我解决这个问题

0 个答案:

没有答案