在触摸 EditText 框之前,Android Recyclerview 不会出现

标签 android firebase-realtime-database android-recyclerview

好的。所以我遇到的问题与此线程中的问题非常相似(尽管该解决方案对我不起作用):RecyclerView not populated until SearchView interaction

我有一个 recyclerview,其中填充了来自 Firebase 监听器的对象。对象进来就好了(我在日志中看到它们)但是直到我触摸“EditText”字段我的 recyclerview 才出现。实际上,我什至不必发送或键入任何内容...我只需触摸框,然后就会出现回收 View ...但之前不会。

我已经尝试了一些不同的事情(包括关于那个问题的公认答案和这里的其他一些)。我从一开始就尝试将焦点设置到那个框...但似乎没有任何帮助。

这是布局的代码:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
<LinearLayout
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="left"
    android:paddingLeft="20dp"
    android:paddingRight="20dp"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:gravity="left">

    <TextView
        android:id="@+id/to"
        style="@style/FullWidthEditText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="40dp"
        android:text="to:"
        android:layout_gravity="bottom|left"
        />

    <TextView
        android:id="@+id/tofield"
        style="@style/FullWidthEditText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|right"
        android:paddingTop="0dp"
        android:text="Juan Foo"
        />
    </LinearLayout>
    <EditText
        android:id="@+id/writebox"
        style="@style/FullWidthEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/border"
        android:focusableInTouchMode="true"
        android:descendantFocusability="beforeDescendants"
        android:hint="Message"/>
    <Button
        android:id="@+id/btn_send"
        android:layout_width="100dp"
        android:layout_height="40dp"
        android:text="@string/btn_send"
        />
    <android.support.v7.widget.RecyclerView
        android:id="@+id/responses"
        android:paddingTop="10dp"
        tools:listitem="@layout/linearlayout_sent"
        tools:itemCount="5"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

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



</LinearLayout>
</ScrollView>

这是 Activity 的代码:

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_write);
        session = new SaveSharedPreference(getApplicationContext());
        toField = findViewById(R.id.tofield);
        String to = getIntent().getStringExtra("type");

        if (to == null) {
            loadReceive();
            toField.setText(getIntent().getStringExtra("username"));

            msgEdit = findViewById(R.id.writebox);
            //msgEdit.requestFocus();
            msend_btn = findViewById(R.id.btn_send);
            msend_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    submitForm();
                }
            });

            mMessageRecycler = findViewById(R.id.responses);
            final MessageListAdapter adapter = new MessageListAdapter(MessageActivity.this, messageList);
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    //  Collections.reverse(events);
                    mMessageRecycler.setAdapter(adapter);
                }
            });
            mMessageAdapter = new MessageListAdapter(this, messageList);
            mMessageRecycler.setLayoutManager(new LinearLayoutManager(this));
           // mMessageRecycler.smoothScrollToPosition(messageList.size());


        //    loadReceive();


        }else{
            toField.setText(getIntent().getStringExtra("name"));

            msgEdit = findViewById(R.id.writebox);
            msend_btn = findViewById(R.id.btn_send);
            msend_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    submitForm();
                }
            });

            SharedPreferences preferences = getPreferences(MODE_PRIVATE);
            final String uid = preferences.getString("nUID",null);
            final String type = getIntent().getStringExtra("type");
            final String titre = getIntent().getStringExtra("title");
            final String text = getIntent().getStringExtra("body");
            final String nom = getIntent().getStringExtra("name");

            long num = Long.valueOf("4543453");


            mMessageRecycler = findViewById(R.id.responses);
            mMessageAdapter = new MessageListAdapter(this, messageList);
            mMessageRecycler.setLayoutManager(new LinearLayoutManager(this));


            messageList.add(new Message("its", "basic", "lee", text, nom, num));

          //  mDatabase2 = FirebaseDatabase.getInstance().getReference("messages");



            //SharedPreferences preferences = getPreferences(MODE_PRIVATE);
//            SharedPreferences.Editor editor = preferences.edit();
//            editor.putString(nom, text); // changed from "liked"
//            // remove this line editor.putString("pic_id", foto_id);
//            editor.commit();

            final MessageListAdapter adapter = new MessageListAdapter(MessageActivity.this, messageList);
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    //  Collections.reverse(events);
                    mMessageRecycler.setAdapter(adapter);
                }
            });
        }

           // loadReceive();

    }

    private void loadReceive() {

        mDatabase2 = FirebaseDatabase.getInstance().getReference("messages");

        Query queryRecycler = mDatabase2.limitToLast(5);
        queryRecycler.addChildEventListener(new ChildEventListener() {

            public void onChildAdded(DataSnapshot dataSnapshot, String previousKey) {

                Message newMessage = dataSnapshot.getValue(Message.class);
                messageList.add(newMessage);
                //moonList.add(dataSnapshot.getValue(Memf.class));
                mMessageAdapter.notifyDataSetChanged();
                Log.d("Msg added ", newMessage.body);



            }

            public void onChildChanged(DataSnapshot dataSnapshot, String previousKey) {
                moonList.add(dataSnapshot.getValue(Memf.class));
//                    messageList.add(dataSnapshot.getValue(Message.class));
//                    mMessageAdapter.notifyDataSetChanged();
            }

            public void onChildRemoved(DataSnapshot dataSnapshot) {
//                    messageList.add(dataSnapshot.getValue(Message.class));
//                    mMessageAdapter.notifyDataSetChanged();
            }

            public void onChildMoved(DataSnapshot dataSnapshot, String previousKey) {
//                    messageList.add(dataSnapshot.getValue(Message.class));
//                    mMessageAdapter.notifyDataSetChanged();
            }

            public void onCancelled(DatabaseError error) {

            }
        });


    }

因为我什至没有按下“发送”按钮...我真的不明白为什么按下“EditText”框应该做任何事情。但是我一触摸它,recyclerview 就完全填充了。我真的很想知道为什么会这样。

最佳答案

我认为不需要“适配器”,你可以只使用“mMessageAdapter”适配器,

第二,放在线下面

mMessageAdapter = new DealAdapter();
mMessageRecycler.setLayoutManager(new LinearLayoutManager(this));

之前

runOnUiThread(new Runnable() {

    @Override
    public void run() {
        //  Collections.reverse(events);
        mMessageRecycler.setAdapter(mMessageAdapter);
    }
});

简而言之,请将 onCreate() 替换为以下内容:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_write);
    session = new SaveSharedPreference(getApplicationContext());
    toField = findViewById(R.id.tofield);
    String to = getIntent().getStringExtra("type");

    if (to == null) {
        loadReceive();
        toField.setText(getIntent().getStringExtra("username"));

        msgEdit = findViewById(R.id.writebox);
        //msgEdit.requestFocus();
        msend_btn = findViewById(R.id.btn_send);
        msend_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                submitForm();
            }
        });

        mMessageRecycler = findViewById(R.id.responses);
        mMessageAdapter = new MessageListAdapter(this, messageList);
        mMessageRecycler.setLayoutManager(new LinearLayoutManager(this));
        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                //  Collections.reverse(events);
                mMessageRecycler.setAdapter(mMessageAdapter);
            }
        });
       // mMessageRecycler.smoothScrollToPosition(messageList.size());


    //    loadReceive();


    }else{
        toField.setText(getIntent().getStringExtra("name"));

        msgEdit = findViewById(R.id.writebox);
        msend_btn = findViewById(R.id.btn_send);
        msend_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                submitForm();
            }
        });

        SharedPreferences preferences = getPreferences(MODE_PRIVATE);
        final String uid = preferences.getString("nUID",null);
        final String type = getIntent().getStringExtra("type");
        final String titre = getIntent().getStringExtra("title");
        final String text = getIntent().getStringExtra("body");
        final String nom = getIntent().getStringExtra("name");

        long num = Long.valueOf("4543453");


        mMessageRecycler = findViewById(R.id.responses);
        mMessageAdapter = new MessageListAdapter(this, messageList);
        mMessageRecycler.setLayoutManager(new LinearLayoutManager(this));


        messageList.add(new Message("its", "basic", "lee", text, nom, num));

      //  mDatabase2 = FirebaseDatabase.getInstance().getReference("messages");



        //SharedPreferences preferences = getPreferences(MODE_PRIVATE);
//            SharedPreferences.Editor editor = preferences.edit();
//            editor.putString(nom, text); // changed from "liked"
//            // remove this line editor.putString("pic_id", foto_id);
//            editor.commit();

        final MessageListAdapter adapter = new MessageListAdapter(MessageActivity.this, messageList);
        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                //  Collections.reverse(events);
                mMessageRecycler.setAdapter(adapter);
            }
        });
    }

       // loadReceive();

}

}

关于在触摸 EditText 框之前,Android Recyclerview 不会出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57942898/

相关文章:

android - 带 CoordinatorLayout 和工具栏的抽屉

ios - 与 Firebase 一对一聊天

Firebase 计费 - 终止开关

java - 从ListView到RecyclerView

android - 如何创建 3 个等宽的 TextView,它们在屏幕上填充父级

android - 我可以修改另一个进程的 UID 吗?

android - 由于 Google 许可政策,应用程序被 Google Play 商店拒绝

javascript - firebase angularfire2 typeahead 查询不起作用

android - 像 Instagram 一样在 RecyclerView 中自动播放视频

java - 如何通过向右滑动调用联系人?如何修复 android studio 告诉我的错误?