2016-08-16 8 views
-1

私はメッセージを送信すると、2秒後にデフォルトのメッセージが返されるデモチャットアプリケーションを開発しています。リサイクルビューは自動的に最後の位置にスクロールされます。すべて正常に動作します。Recyclerviewでの現在のスクロール位置による自動スクロール

しかし、トップ/ミドルまたはエンド以外のいずれかにスクロールすると、相手側からメッセージを受け取った場合、自動的にスクロールして終了する必要はありません。作業を簡素化するには、Whatsupと同じにする必要があります。私のアクティビティクラスを見つけてください。

public class ChatRoomActivity extends AppCompatActivity { 

    private String TAG = ChatRoomActivity.class.getSimpleName(); 

    private RecyclerView recyclerView; 
    private ChatRoomThreadAdapter mAdapter; 
    private ArrayList<Message> messageArrayList; 
    private EditText inputMessage; 
    private ImageView btnSend; 
    String selfUserId ="100"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_driver_chat); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     inputMessage = (EditText) findViewById(R.id.etChatMessage); 
     btnSend = (ImageView) findViewById(R.id.btnYou); 


     getSupportActionBar().setTitle(getResources().getString(R.string.driver_prof_name)); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 



     recyclerView = (RecyclerView) findViewById(R.id.rvChatList); 

     messageArrayList = new ArrayList<>(); 

     // self user id is to identify the message owner 

     mAdapter = new ChatRoomThreadAdapter(this, messageArrayList, selfUserId); 

     LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 
     recyclerView.setAdapter(mAdapter); 

     btnSend.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       sendMessage(); 
       new CountDownTimer(2000, 1000) { 
        public void onFinish() { 
         // When timer is finished 
         // Execute your code here 
         fetchChatThread(); 

        } 

        public void onTick(long millisUntilFinished) { 
         // millisUntilFinished The amount of time until finished. 
        } 
       }.start(); 
      } 
     }); 

    } 



    /** 
    * Handling new push message, will add the message to 
    * recycler view and scroll it to bottom 
    * */ 


    /** 
    * Posting a new message in chat room 
    * will make an http call to our server. Our server again sends the message 
    * to all the devices as push notification 
    * */ 
    private void sendMessage() { 
     final String strmessage = this.inputMessage.getText().toString().trim(); 

     if (TextUtils.isEmpty(strmessage)) { 
      Toast.makeText(getApplicationContext(), "Enter a message", Toast.LENGTH_SHORT).show(); 
      return; 
     } 


     this.inputMessage.setText(""); 
     String commentId = "message_id"; 
     String commentText = strmessage; 
     Calendar c = Calendar.getInstance(); 
     SimpleDateFormat dateformat = new SimpleDateFormat("hh:mm aa"); 
     String datetime = dateformat.format(c.getTime()); 
     String createdAt = datetime; 

     String userId = selfUserId; 
     String userName = "name"; 
     User user = new User(userId, userName, null); 

     Message message = new Message(); 
     message.setId(commentId); 
     message.setMessage(commentText); 
     message.setCreatedAt(createdAt); 
     message.setUser(user); 

     messageArrayList.add(message); 

     mAdapter.notifyDataSetChanged(); 
     if (mAdapter.getItemCount() > 1) { 
      // scrolling to bottom of the recycler view 
      recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, null, mAdapter.getItemCount() - 1); 
     } 
    } 


    /** 
    * Fetching all the messages of a single chat room 
    * */ 
    private void fetchChatThread() { 

     String commentId = "message_id"; 
     String commentText = "Replay from Other"; 
     Calendar c = Calendar.getInstance(); 
     SimpleDateFormat dateformat = new SimpleDateFormat("hh:mm aa"); 
     String datetime = dateformat.format(c.getTime()); 
     String createdAt = datetime; 

     String userId = "user_id"; 
     String userName = "username"; 
     User user = new User(userId, userName, null); 

     Message message = new Message(); 
     message.setId(commentId); 
     message.setMessage(commentText); 
     message.setCreatedAt(createdAt); 
     message.setUser(user); 

     messageArrayList.add(message); 
     mAdapter.notifyDataSetChanged(); 
     if (mAdapter.getItemCount() > 1) 
     { 
      recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, null, mAdapter.getItemCount() - 1); 
     } 

      } 

アダプタクラスが

public class ChatRoomThreadAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    private static String TAG = ChatRoomThreadAdapter.class.getSimpleName(); 

    private String userId; 
    private int SELF = 100; 
    private static String today; 

    private Context mContext; 
    private ArrayList<Message> messageArrayList; 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     TextView message, timestamp; 

     public ViewHolder(View view) { 
      super(view); 
      message = (TextView) itemView.findViewById(R.id.tvChatMessage); 
      timestamp = (TextView) itemView.findViewById(R.id.tvChatTimeStamp); 
     } 
    } 


    public ChatRoomThreadAdapter(Context mContext, ArrayList<Message> messageArrayList, String userId) { 
     this.mContext = mContext; 
     this.messageArrayList = messageArrayList; 
     this.userId = userId; 

     Calendar calendar = Calendar.getInstance(); 
     today = String.valueOf(calendar.get(Calendar.DAY_OF_MONTH)); 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView; 

     // view type is to identify where to render the chat message 
     // left or right 
     if (viewType == SELF) { 
      // self message 
      itemView = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.custom_driver_chat_itself, parent, false); 
     } else { 
      // others message 
      itemView = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.custom_driver_chat_others, parent, false); 
     } 


     return new ViewHolder(itemView); 
    } 


    @Override 
    public int getItemViewType(int position) { 
     Message message = messageArrayList.get(position); 
     if (message.getUser().getId().equals("100")) { 
      return SELF; 
     } 

     return position; 
    } 

    @Override 
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { 
     Message message = messageArrayList.get(position); 
     ((ViewHolder) holder).message.setText(message.getMessage()); 

//  String timestamp = getTimeStamp(message.getCreatedAt()); 
// 
//  if (message.getUser().getName() != null) 
//   timestamp = message.getUser().getName() + ", " + timestamp; 

     ((ViewHolder) holder).timestamp.setText(message.getCreatedAt()); 
    } 

    @Override 
    public int getItemCount() { 
     return messageArrayList.size(); 
    } 

    public static String getTimeStamp(String dateStr) { 
     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     String timestamp = ""; 

     today = today.length() < 2 ? "0" + today : today; 

     try { 
      Date date = format.parse(dateStr); 
      SimpleDateFormat todayFormat = new SimpleDateFormat("dd"); 
      String dateToday = todayFormat.format(date); 
      format = dateToday.equals(today) ? new SimpleDateFormat("hh:mm a") : new SimpleDateFormat("dd LLL, hh:mm a"); 
      String date1 = format.format(date); 
      timestamp = date1.toString(); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

     return timestamp; 
    } 

答えて

1

ちょうどあなたのif文

if (mAdapter.getItemCount() > 1) 
    { 
     recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, null, mAdapter.getItemCount() - 1); 
    } 

if (!mAdapter.isEmpty() && !recyclerView.canScrollVertically(1)) 
    { 
     recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, null, mAdapter.getItemCount() - 1); 
    } 

ブールcanScrollVerticallyを変更で(int direction)このビューが特定の方向に垂直にスクロールされることを確認してください( )。パラメータdirection int: スクロールアップを確認する場合は否定、スクロールをチェックする場合はプラスを選択します。 このビューを指定された の方向にスクロールできる場合はtrue、そうでない場合はfalseを返します。

+0

私はそれを有効にしていますが、非常に最後の位置にスクロールしなければならないときにのみ動作します。別のものを使用しました。int finalVisiblePosition = layoutManager.findLastVisibleItemPosition(); if(finalVisiblePosition == mAdapter.getItemCount() - 2) { recyclerView.getLayoutManager()。smoothScrollToPosition(recyclerView、null、mAdapter.getItemCount() - 1); }これは完璧ではありませんが、私の要件に少し近いです。 – Noufal

+1

あなたの質問では、あなたは「終わり以外のどこでも」と言った。とにかく嬉しく思った。 – Sohaib

+0

私は正しく理解していませんでした!それはちょうど近かった。あなたがWhatsupの他のポジションにスクロールし、私たちが相手からのリプレイを得たとき、あなたはユーの変更を知っていることを知っている。 – Noufal

関連する問題