Android Recyclerview在scrolltop上加载更多内容

Yas*_*maz 1 android android-recyclerview

嘿社区我想RecyclerView在聊天应用程序中做出类似的东西.

我试过setStackFromEnd,它运作良好.

final LinearLayoutManager llm = new LinearLayoutManager(getApplicationContext());
    llm.setOrientation(LinearLayoutManager.VERTICAL);
    llm.setStackFromEnd(true);
Run Code Online (Sandbox Code Playgroud)

我根据本教程加载了更多代码.在教程结束时,您应该看到一个视频:Recyclerview Bottom Progress

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);

            totalItemCount = linearLayoutManager.getItemCount();
            lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();

            if (!isLoading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                if (mOnLoadMoreListener != null) {
                    mOnLoadMoreListener.onLoadMore();
                }
                isLoading = true;
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

所以我需要RecyclerView在聊天应用程序中做出类似的东西.从最后的堆栈工作完美但我需要触发加载更多的方法当我去顶部而不是底部.还可以在顶部而不是底部添加新项目.提前致谢.

Muk*_*ana 9

onScrollListener如果您只是想Button在顶部显示"Load Earlier Messages" ,则无需使用.您可以简单地xml为您的负载创建一个Button,将其作为您的第一行,RecyclerView并创建一个Interface处理点击事件.我正在Adpater为我的一个项目发布代码.希望这将有助于您获得进一步的进展.

/**
 * Created by Mukesh on 21/12/2015.
 */
public class ChatListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private Context mContext;
    private List<UserMessage> userMessagesList;
    private LayoutInflater mLayoutInflater;
    private static final int ROW_TYPE_LOAD_EARLIER_MESSAGES = 0;
    private static final int ROW_TYPE_SENDER = 1;
    private static final int ROW_TYPE_RECEIVER = 2;
    private int userId;
    private boolean isLoadEarlierMsgs;
    private LoadEarlierMessages mLoadEarlierMessages;

    public ChatListAdapter(Context context, int userId, List<UserMessage> userMessagesList) {
        mContext = context;
        this.userMessagesList = userMessagesList;
        mLayoutInflater = LayoutInflater.from(mContext);
        this.userId = userId;
        mLoadEarlierMessages = (LoadEarlierMessages) mContext;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case ROW_TYPE_LOAD_EARLIER_MESSAGES:
                return new LoadEarlierMsgsViewHolder(mLayoutInflater.inflate(R.layout
                        .row_load_earlier_messages, parent, false));
            case ROW_TYPE_SENDER:
                return new SenderMsgViewHolder(mLayoutInflater.inflate(R.layout.row_sender_msg,
                        parent, false));
            case ROW_TYPE_RECEIVER:
                return new ReceiverMsgViewHolder(mLayoutInflater.inflate(R.layout
                        .row_receiver_msg, parent, false));
            default:
                return null;
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        switch (getItemViewType(position)) {
            case ROW_TYPE_LOAD_EARLIER_MESSAGES:
                LoadEarlierMsgsViewHolder loadEarlierMsgsViewHolder =
                        (LoadEarlierMsgsViewHolder) holder;
                if (isLoadEarlierMsgs) {
                    loadEarlierMsgsViewHolder.btLoadEarlierMessages
                            .setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View view) {
                                    if (mLoadEarlierMessages != null) {
                                        mLoadEarlierMessages.onLoadEarlierMessages();
                                    }
                                }
                            });
                } else {
                    loadEarlierMsgsViewHolder.btLoadEarlierMessages.setVisibility(View.GONE);
                }
                break;
            case ROW_TYPE_SENDER:
                SenderMsgViewHolder senderMsgViewHolder = (SenderMsgViewHolder) holder;
                // set data for your sender chat bubble
                break;
            case ROW_TYPE_RECEIVER:
                ReceiverMsgViewHolder receiverMsgViewHolder = (ReceiverMsgViewHolder) holder;
                // set data for your receiver chat bubble
                break;
        }
    }

    @Override
    public int getItemCount() {
        return userMessagesList.size() + 1;
    }

    @Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return ROW_TYPE_LOAD_EARLIER_MESSAGES; // row load earlier messages
        } else if (userMessagesList.get(position - 1).getUser_id() == userId) {
            return ROW_TYPE_SENDER; // sender row;
        } else {
            return ROW_TYPE_RECEIVER; // receiver row;
        }
    }

    public interface LoadEarlierMessages {
        void onLoadEarlierMessages();
    }


    public void setLoadEarlierMsgs(boolean isLoadEarlierMsgs) {
        this.isLoadEarlierMsgs = isLoadEarlierMsgs;
    }

    static class LoadEarlierMsgsViewHolder extends RecyclerView.ViewHolder {

        @Bind(R.id.btLoadEarlierMsgs) Button btLoadEarlierMessages;

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

    static class SenderMsgViewHolder extends RecyclerView.ViewHolder {

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

    static class ReceiverMsgViewHolder extends RecyclerView.ViewHolder {

        public ReceiverMsgViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

最后落实LoadEarlierMessages在你的听众ChatActivityOverrideonLoadEarlierMessages()方法

    /**
     * Created by Mukesh on 21/12/2015.
     */
    public class ChatActivity extends AppCompatActivity
            implements ChatListAdapter.LoadEarlierMessages {

       // getting users recent messages and init RecyclerView
       private void showUserMessages() {
        // initialising LayoutManager for RecyclerView and setting that to RecyclerView
        mLinearLayoutManager = new LinearLayoutManager(this);
        mLinearLayoutManager.setStackFromEnd(true); // to start the list from bottom
        rvChatsList.setLayoutManager(mLinearLayoutManager);

        // initialising RecyclerView Adapter and setting that to the RecyclerView
        mChatListAdapter = new ChatListAdapter(this, userId, userMessagesList);
        rvChatsList.setAdapter(mChatListAdapter);

        // getting count of friend/contact messages and toggling visibility of load more button accordingly
        int count = mDataBaseHandler.getCountOfMessages(contactId);
        if (count != 0) {
            if (count > Constants.MESSAGES_LIMIT_FOR_LOCAL_DATABASE) {
                mChatListAdapter.setLoadEarlierMsgs(true);
            } else {
                mChatListAdapter.setLoadEarlierMsgs(false);
            }
            userMessagesList.addAll(mDataBaseHandler.getAllMessagesOfContact(contactId));
            mChatListAdapter.notifyDataSetChanged();
        }

    }

        @Override
        public void onLoadEarlierMessages() {
            ArrayList<UserMessage> tempList = mDataBaseHandler
                    .getPreviousMessagesOfContact(contactId, userMessagesList.size());
            if (tempList.size() > 0) {
                if (tempList.size() < Constants.MESSAGES_LIMIT_FOR_LOCAL_DATABASE) {
                    mChatListAdapter.setLoadEarlierMsgs(false);
                }
                View v = rvChatsList.getChildAt(0);
                int top = (v == null) ? 0 : v.getTop();
                for (int i = 0; i < tempList.size(); i++) {
                    userMessagesList.add(0, tempList.get(i));
                }
                mChatListAdapter.notifyDataSetChanged();
                mLinearLayoutManager.scrollToPositionWithOffset(tempList.size(), top);
            } else {
                mChatListAdapter.setLoadEarlierMsgs(false);
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助.. !!