2016-11-15 8 views
2

アンドロイドスタジオで簡単なチャットアプリケーションを1つ作成しました。最初に私がテキストを送信するとき、recyclerviewの最後の項目は常にフォーカスされていますが、ソフトキーボードを隠してからもう一度editextをクリックしてメッセージを送信すると、recyclerviewの最後の項目にはフォーカスがありません。ソフトキーボードがフォーカスしているときに最後のメッセージを見るためにスクロールダウンする必要があります。以下 は、レイアウトとMainActivityコードです:ここでソフトキーボードがチャットアプリケーションで表示されているときに、recyclerviewの最後の項目を表示し続ける

EditText messageEdt; 
ImageView sendBtn; 
RecyclerView recyclerView; 
CustomAdapter adapter; 
List<Model> chatList; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    messageEdt = (EditText) findViewById(R.id.messageText); 
    sendBtn = (ImageView) findViewById(R.id.sendBtn); 
    recyclerView = (RecyclerView) findViewById(R.id.recyclerChatList); 
    chatList = new ArrayList<>(); 
    adapter = new CustomAdapter(this); 
    recyclerView.setAdapter(adapter); 
    recyclerView.setHasFixedSize(true); 
    recyclerView.setLayoutManager(new LinearLayoutManager(this)); 
    messageEdt.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View view, boolean b) { 
      if(b && adapter.getItemCount()>1){ 
       recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView,null,adapter.getItemCount()-1); 
      } 
     } 
    }); 
    getSupportActionBar().hide(); 

} 

private void getData() { 
    String messageStr = messageEdt.getText().toString().replaceAll("[ ]","%20"); 
    Log.e("messageStr",messageStr); 
    Model model = new Model(); 
    model.setMessage(messageEdt.getText().toString()); 
    model.setUser("User"); 
    chatList.add(model); 

    messageEdt.setText(""); 

    adapter.getChatList(chatList); 
    adapter.notifyDataSetChanged(); 
    if(adapter.getItemCount()>1){ 
     recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView,null,adapter.getItemCount()-1); 
    } 
    url = "http://chat.vicz.in/get/"; 
    url = url.concat(messageStr); 
    Log.e("Url", url); 
    StringRequest getData = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      try { 
       url = "http://chat.vicz.in/get/"; 
       Log.e("Response", response); 
       JSONObject responseObj = new JSONObject(response); 
       String stringResponse = responseObj.getString("response"); 
       Model data = new Model(); 
       data.setMessage(stringResponse); 
       data.setUser("Bot"); 
       chatList.add(data); 
       recyclerView.smoothScrollToPosition(chatList.size()-1); 
       adapter.getChatList(chatList); 
       adapter.notifyDataSetChanged(); 
       if(adapter.getItemCount()>1){ 
        recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView,null,adapter.getItemCount()-1); 
       } 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      url = "http://chat.vicz.in/get/"; 
     } 
    }); 
    getData.setRetryPolicy(new DefaultRetryPolicy(30000, 5, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 
    Volley.newRequestQueue(this).add(getData); 


} 

public void sendMessage(View view) { 
    getData(); 
} 

は私のチャットアプリケーションのレイアウトです:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/activity_main" 
android:layout_width="match_parent" 
android:orientation="vertical" 
android:layout_height="match_parent" 

tools:context="com.example.admin.chatbot.MainActivity"> 



    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerChatList" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:background="@null" 
     android:divider="@null" 
     android:transcriptMode="alwaysScroll" 
     android:stackFromBottom="true"> 

    </android.support.v7.widget.RecyclerView> 



     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="horizontal"> 

      <EditText 
       android:id="@+id/messageText" 
       android:layout_width="0dp" 
       android:layout_height="match_parent" 
       android:layout_weight="80" 
       android:hint="Enter Message" /> 

      <ImageView 
       android:id="@+id/sendBtn" 
       android:layout_width="0dp" 
       android:layout_height="match_parent" 
       android:layout_weight="20" 
       android:onClick="sendMessage" 
       android:src="@android:drawable/ic_menu_send" /> 
     </LinearLayout> 

私はすでにsmoothScrollToPositionを()を使用しているが、ときにのみ、最初に動作しますソフトキーボードは最初から表示されます。しかし、ソフトキーボードを非表示にしてフォーカスを合わせると、リストの最後の項目にはフォーカスがありません。

答えて

1

これは、RecyclerViewのレイアウトマネージャで行う必要があります。以下のコードは、RecyclerViewの下部から各項目を積み重ね、フォーカスを下部に維持します。

LinearLayoutManager llm = new LinearLayoutManager(getContext()); 
llm.setReverseLayout(true); 
llm.setStackFromEnd(true); 
myRecyclerView.setLayoutManager(llm); 
+0

そのていました。 –

+0

私はwhatsappのようにしたいです。 editextをクリックすると、チャットルームにある最後のテキストにフォーカスが移動します。 –

+0

'OnFocusChangeListener'を持つことに加えて、' OnClickListener'を 'EditText'に追加して滑らかにスクロールしてみますか? –

0

次のオプション試すことができます:のAndroidManifest.xmlに必要な活動で

  1. 使用AdjustResize(Adjust Resizeを)か、AdjustPan(それはしかし上部のツールバーを非表示にします)
  2. を使用することができますあなたは(私のために働いていた)

LinearLayoutManager layoutManager = new LinearLayoutManager(mActivity); layoutManager.setStackFromEnd(true);

0であれば、その後、働いていないサイズを変更調整する場合

(setReverseLayout(真)が使用されている場合、リストは逆の順序で表示されます)

もう一つの答えがonClickListenerを使うことを提案し、逆の順序でチャットリストを印刷

mRecyclerView.smoothScrollToPosition(mAdapter.getItemCount() - 1); 
関連する問題