我在android studio中创建了一个简单的聊天应用程序。最初,当我发送文本时,recycle view的最后一项总是在焦点上,但当我隐藏软键盘,然后再次单击editext以发送消息时,recycle view的最后一项不在焦点上。当软键盘处于焦点时,我需要向下滚动才能看到最后一条消息。下面是布局和主要活动代码:
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(),但它仅在软键盘从一开始可见时才开始工作。但如果我隐藏软键盘,然后将其聚焦,列表中的最后一项将不在焦点上。
你可以试试这个:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
您应该在 RecyclerView 的布局管理器上执行此操作。下面的代码将从 RecyclerView 的底部堆叠每个项目,并将焦点保持在底部。
LinearLayoutManager llm = new LinearLayoutManager(getContext());
llm.setReverseLayout(true);
llm.setStackFromEnd(true);
myRecyclerView.setLayoutManager(llm);
您可以尝试以下选项:
< code > LinearLayoutManager layout manager = new LinearLayoutManager(m activity);layout manager . setstackfromend(true);(为我工作)
(如果使用setReverseLayout(true ),则列表将以相反的顺序显示)
另一个答案建议使用onClickListener和
mRecyclerView.smoothScrollToPosition(mAdapter.getItemCount() - 1);
我有一个活动,其中包含水平回收视图,显示从服务器检索到的电影图标 当用户将回收器视图滚动到其末尾时 - 使回收器视图的最后一项可见,我想显示“更多”按钮以允许加载其他图标 当用户滚动到回收器视图的末尾时,我如何获得指示?
我已经谷歌了很多,但找不到一个令人满意的解决方案。下面的截图描述了我所面临的问题。 软键盘可见时,编辑文本隐藏在标题栏后面。我已经把 主布局中的属性。如果删除此属性,则布局工作正常。但设计需求需要表单位于中心。我什么都试过了。尝试使用scrollview并将其放入清单 也尝试过“adjustPan”,它确实有效。但是在这种情况下,整个表单不会被推上去,编辑文本“MobileNo”和按钮隐藏在软键盘
我用firebase实时数据库和firebase身份验证方法创建了这个聊天应用程序,但我真的很困惑,我不知道如何在聊天应用程序中获得用户的最后一次露面。 下面是我在onCreate medthod中尝试的代码。 任何想法或替代方法都将不胜感激。
我在这个登录屏幕上工作,我希望所有字段、文本和按钮在显示IME时调整大小。我已经在androidManifest.xml上使用了android: windowSoftInputMode="调整调整大小",但我仍然在其他元素下面获取一些元素。 虚拟键盘是否覆盖了TextView“地籍Agora”(id=地籍)无关紧要。但是,我希望至少EditText、它们的文本视图和按钮都是可见的。 我发现这个未回
我有一个方法,它将检查RecolyerView中的最后一个元素是否被用户完全可见,到目前为止,我有这段代码,问题是如何检查RecolyerView是否到达了它的底部? PS我有项目分隔符
如何在中获取当前项?在我的用例中,RV项占用了所有屏幕空间,因此一次只有一个项。我以前试过谷歌,但没有找到任何有用的东西。