2016-05-03 45 views
1

嗨社區我想在聊天應用程序中使用RecyclerViewAndroid 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就像在聊天應用。從結束堆棧工作完美,但我需要觸發加載更多的方法,當我去頂而不是底部。在頂部而不是底部添加新項目。提前致謝。

+0

您是否自動加載舊信息或想要顯示按鈕「加載早期信息」,如whatsapp在頂部,並在該按鈕單擊,加載早期的消息? –

+0

@MukeshRana是的,這正是我想要做的。 –

回答

8

如果您只是想在頂部顯示Button「加載早期消息」,則不需要使用onScrollListener。您可以簡單地爲您的負載創建一個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); 
     } 
    } 
} 

最後實現你的ChatActivityLoadEarlierMessages監聽器和OverrideonLoadEarlierMessages()方法

/** 
    * 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); 
      } 
     } 

    } 

希望這將有助於.. !!

+0

我想我明白了,你總是在第一個位置添加新的消息而不是最後的位置。我用這樣的:userMessagesList.add(tempList.get(i));當我打開電腦時,我會嘗試這個。 –

+0

如果您更新您的回收視圖代碼,您如何初始化回收視圖並將其提供給任何數據。這是一個很好的答案,誰想從零開始做像我這樣的recylerview –

+1

很高興幫助你。更新了代碼,以便更好地理解:) –

相關問題