2016-05-03 12 views
1

こんにちはコミュニティRecyclerViewはチャットアプリケーションのようにしたいと思います。Android 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のようなボタン「Load Earlier Messages」を表示するには、そのボタンをクリックして以前のメッセージをロードしますか? –

+0

@MukeshRanaはい、まさに私がしたいことです。 –

答えて

8

Buttonの上部に「」と表示するだけの場合は、onScrollListenerを使用する必要はありません。あなたの負荷のためにxmlを作成してButtonの最初の行にし、クリックイベントを処理する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));私はPCを開くときにこれを試してみます。 –

+0

あなたがあなたのrecyclerviewコードを更新する場合、あなたのrecyclerviewをどのように初期化し、それをどのようなデータに与えるか。これは、ゼロから始めて私のような書き直しをしたいという良い答えです –

+1

あなたを助けてくれてうれしいです。 –

関連する問題