Java 当键盘弹出时,如何同步RecyclerView的位置?

Java 当键盘弹出时,如何同步RecyclerView的位置?,java,android,android-recyclerview,Java,Android,Android Recyclerview,我正在使用RecyclerView进行聊天。请参阅下面附带的屏幕截图,以便更好地了解问题: IMAGE-1 IMAGE-2 现在,这里的问题是当键盘打开时,用户必须能够看到上次发送/接收的消息,但是在image-2中,正如您所看到的,RecyclerView的滚动位置在较早的消息处 我尝试了一些改变: 更改了android:WindowsOfInputMode=“adjustResize” 更改了RecyclerView的平滑滚动,rview.smoothScrollToPosition

我正在使用
RecyclerView
进行聊天。请参阅下面附带的屏幕截图,以便更好地了解问题:

IMAGE-1

IMAGE-2

现在,这里的问题是当键盘打开时,用户必须能够看到上次发送/接收的消息,但是在
image-2
中,正如您所看到的,
RecyclerView
的滚动位置在较早的消息处

我尝试了一些改变:

  • 更改了android:WindowsOfInputMode=“adjustResize”

  • 更改了RecyclerView的平滑滚动,
    rview.smoothScrollToPosition(adapter_data.size())

    我可以做些什么来解决这个问题,以便在键盘打开时收到最后一条消息

编辑-1

这是我的适配器的代码:

CustomAdapter.class

    public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.FeedsViewHolder>
{



    DataHolder d1 = new DataHolder();

    public  class FeedsViewHolder extends RecyclerView.ViewHolder
    {
        private TextView chat;
        private Typeface face;


                FeedsViewHolder(View itemView)
        {
            super(itemView);

            chat = (TextView)itemView.findViewById(R.id.chatMessage);
            face = Typeface.createFromAsset(itemView.getContext().getAssets(), "Fonts/Roboto-Regular.ttf");
            chat.setTypeface(face);


        }



    }

    private static class DataHolder
    {
        List<Text> feeds;

    }



    CustomAdapter(List<Text> feeds)
    {
        this.d1.feeds = feeds;
    }



    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }


    @Override
    public FeedsViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.chat_message, viewGroup, false);
        FeedsViewHolder pvh = new FeedsViewHolder(v);
        return pvh;
    }



    @Override
    public void onBindViewHolder(FeedsViewHolder feedViewHolder, int i)
    {
        RelativeLayout.LayoutParams params =
                (RelativeLayout.LayoutParams)feedViewHolder.chat.getLayoutParams();

        if(d1.feeds.get(i).isMachineOrHuman())
        {
            params.addRule(RelativeLayout.ALIGN_PARENT_START);
            feedViewHolder.chat.setLayoutParams(params);
            feedViewHolder.chat.setBackgroundResource(R.drawable.user);
            feedViewHolder.chat.setText(d1.feeds.get(i).getMessage());
        }

        else
        {
            params.addRule(RelativeLayout.ALIGN_PARENT_END);
            feedViewHolder.chat.setLayoutParams(params);
            feedViewHolder.chat.setBackgroundResource(R.drawable.ais);
            feedViewHolder.chat.setText(d1.feeds.get(i).getMessage());
        }



    }

    @Override
    public int getItemCount()
    {

        if(d1.feeds!=null)
        {
            return d1.feeds.size();
        }
        else
        {
            return 0;
        }
    }



}
公共类CustomAdapter扩展了RecyclerView.Adapter { 数据持有者d1=新数据持有者(); 公共类FeedsViewHolder扩展了RecyclerView.ViewHolder { 私人文本视图聊天; 私人字体; FeedsView文件夹(视图项视图) { 超级(项目视图); chat=(TextView)itemView.findViewById(R.id.chatMessage); face=Typeface.createFromAsset(itemView.getContext().getAssets(),“Fonts/Roboto Regular.ttf”); chat.setTypeface(face); } } 私有静态类数据持有者 { 列表提要; } CustomAdapter(列表源) { this.d1.feed=feed; } @凌驾 附加ToRecyclerView(RecyclerView RecyclerView)上的公共无效{ super.onAttachedToRecyclerView(recyclerView); } @凌驾 公共FeedsViewHolder onCreateViewHolder(视图组视图组,int i){ 视图v=LayoutInflater.from(viewGroup.getContext()).flate(R.layout.chat_消息,viewGroup,false); FEEDSVIEWORLDER pvh=新的FEEDSVIEWORLDER(v); 返回pvh; } @凌驾 BindViewHolder上的公共无效(FeedsViewHolder feedViewHolder,int i) { RelativeLayout.LayoutParams参数= (RelativeLayout.LayoutParams)feedViewHolder.chat.getLayoutParams(); if(d1.feeds.get(i).isMachineOrHuman()) { params.addRule(RelativeLayout.ALIGN\u PARENT\u START); feedViewHolder.chat.setLayoutParams(参数); feedViewHolder.chat.setBackgroundResource(R.drawable.user); feedViewHolder.chat.setText(d1.feeds.get(i.getMessage()); } 其他的 { params.addRule(RelativeLayout.ALIGN\u PARENT\u END); feedViewHolder.chat.setLayoutParams(参数); feedViewHolder.chat.setBackgroundResource(R.drawable.ais); feedViewHolder.chat.setText(d1.feeds.get(i.getMessage()); } } @凌驾 public int getItemCount() { if(d1.feeds!=null) { 返回d1.feeds.size(); } 其他的 { 返回0; } } }
chat_message.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/chat_rel"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView android:id="@+id/chatMessage"
android:layout_width="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:gravity="start"
android:textSize="15sp"
android:textColor="#ffffff"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android" />


android:windowSoftInputMode=“adjustResize”
在这里工作得很好,但问题与
RecyclerView
有关,我正在寻找一种编程方式,当键盘弹出时滚动到
RecyclerView
的末尾。

可能重复,因为您说添加了adjustResize,你检查过它是否真的有效吗?你可以在页面上设置背景图片,看看键盘弹出时页面是否垂直缩小。此外,还应在OnConfiguration Changed中添加平滑滚动。很抱歉,如果这些问题听起来很愚蠢,但似乎你尝试的应该是解决方案。这对我很有效。@Scorpio adjustResize正在使用图片perfectrview.smoothScrollToPosition(适配器_data.size()-1)?你也可以从这里尝试答案:“天蝎<代码> Studio StudioLosisisid()/Cuffe),这里是实例,考虑一个长的对话,所以自动地,随着会话的进行,循环视图被移动到最后的消息,只有当键盘打开时,位置才被改变,平滑卷轴工作正常