首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android回收站负载更多关于滚动顶

Android回收站负载更多关于滚动顶
EN

Stack Overflow用户
提问于 2016-05-03 02:09:06
回答 1查看 5.5K关注 0票数 1

嘿,社区,我想做一个像聊天应用程序一样的RecyclerView

我试过setStackFromEnd,效果很好。

代码语言:javascript
运行
复制
final LinearLayoutManager llm = new LinearLayoutManager(getApplicationContext());
    llm.setOrientation(LinearLayoutManager.VERTICAL);
    llm.setStackFromEnd(true);

在本教程的基础上加载更多代码,在教程的末尾,您应该会看到一个视频:回收站底部进度

代码语言:javascript
运行
复制
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;
            }
        }
    });

所以我需要做一个像聊天应用程序一样的RecyclerView。堆栈从末端是完美的工作,但我需要触发加载更多的方法时,我去顶部,而不是下降。还可以在顶部而不是底部添加新的项目。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-03 10:56:35

如果您只是想在顶部显示一个“加载早期消息”,则不需要使用onScrollListener。您可以简单地为加载更多的xml创建一个Button,将其作为RecyclerView的第一行,并创建一个Interface来处理单击事件。我正在发布来自我的一个项目的Adpater代码。希望这将有助于你得到一些想法,以进一步推进。

代码语言:javascript
运行
复制
/**
 * 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);
        }
    }
}

最后,在LoadEarlierMessages中实现ChatActivity侦听器,并在Override中实现onLoadEarlierMessages()方法

代码语言:javascript
运行
复制
    /**
     * 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);
            }
        }

    }

希望这会有帮助!

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36994472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档