Android Recyclerview在scrolltop上加载更多内容

时间:2016-05-03 02:09:07

标签: android android-recyclerview

嘿社区我想在聊天应用程序中制作一个RecyclerView

我尝试了setStackFromEnd并且它运作良好。

final LinearLayoutManager llm = new LinearLayoutManager(getApplicationContext());
    llm.setOrientation(LinearLayoutManager.VERTICAL);
    llm.setStackFromEnd(true);

我根据本教程加载了更多代码,在教程结束时,您应该看到一个视频: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;
            }
        }
    });

所以我需要在聊天应用程序中创建一个RecyclerView。从最后的堆栈工作完美但我需要触发加载更多的方法当我去顶部而不是底部。还可以在顶部而不是底部添加新项目。提前谢谢。

1 个答案:

答案 0 :(得分:9)

如果您只想展示onScrollListener&#34;加载早期消息&#34;您不需要使用Button。在顶部。您只需为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); } } } 的代码。希望能帮助您进一步深入了解。

LoadEarlierMessages

最后在ChatActivityOverride onLoadEarlierMessages()方法

中实施 /** * 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); } } } 听众
<?php
$query="SELECT income.Source
          ,SUM(income.Amount) as in_Amount
          ,SUM(expenses.Amount) as out_Amount
          ,SUM(income.Amount) - SUM(expenses.Amount) as total 
        FROM income as income
          , expenses";

$result=mysql_query($query);

while($row=mysql_fetch_array($result)){
    echo '<p class="stat"><span class="label label-danger">' . $row['total']. '</span> Naira Net Income</p>';
}
?>

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