【问题标题】:Android Recyclerview not appearing until EditText box touchedAndroid Recyclerview 直到 EditText 框才出现
【发布时间】:2019-11-27 02:20:19
【问题描述】:

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

我有一个由来自 Firebase 侦听器的对象填充的回收器视图。对象进来得很好(我在日志中看到它们),但直到我触摸“EditText”字段时我的回收视图才会出现。实际上,我什至不需要发送或输入任何内容...我只需触摸该框,然后会出现 recyclerview...但不是之前。

我尝试了一些不同的方法(包括关于该问题的公认答案以及此处的其他一些问题)。而且我从一开始就尝试将焦点设置在该框上……但似乎没有任何帮助。

这是布局的代码:

<?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>

这是活动的代码:

 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 完全填充了它。我真的很想知道为什么会这样。

【问题讨论】:

    标签: android firebase-realtime-database android-recyclerview


    【解决方案1】:

    我认为不需要'适配器',你可以使用'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();
    
    }
    
    }
    

    【讨论】:

    • 好的。我已经改写了这个问题。我的 Recyclerview 已填充......它只是在我点击“EditText”框之前不会出现。正如我在描述中所解释的......适配器填充得很好......直到我点击 EditText 框,回收器视图才会出现。 (并且仅当我点击 EditText 框时。)屏幕上的其他任何地方都没有。
    • 我的意思是我尝试了你的建议......它没有工作。结果相同。
    • 。这应该在 .setAdapter() 中,因为除非您点击 EditText,否则 RecyclerView 不会附加到适配器。让我再检查一遍
    • 如果这不起作用,请告诉我删除 EditText 并使用相同代码时的响应是什么?
    • 赢家...赢家...! Setadapter 应该是“mMessageAdapter”而不是“messageList”......但是一旦我改变它......它就起作用了!非常感谢!
    【解决方案2】:

    我会帮你的!您需要在 MessageListAdapter 适配器中编写一个函数

     void setData(Message list){
    
       if(youradapterlist != null){
       youradapterlist.add(list);
       notifyDataSetChanged();
        }}
    

    并在

    中调用这个函数
          public void onChildAdded(DataSnapshot dataSnapshot, String previousKey) {
    
            Message newMessage = dataSnapshot.getValue(Message.class);
               if(mMessageAdapter != null){
             mMessageAdapter.setData(newMessage );
             }
            }
    

    希望能解决你的问题

    【讨论】:

    • 它没有。这只会使消息加倍。我在活动中已经有类似的东西来通知数据集更改。就是这样......无论出于何种原因......它不会出现,直到我触摸编辑框。真是个谜……
    • 好的。我已经改写了这个问题。我的 Recyclerview 已填充......它只是在我点击“EditText”框之前不会出现。正如我在描述中所解释的......适配器填充得很好......直到我点击 EditText 框,回收器视图才会出现。 (并且仅当我点击 EditText 框时。)屏幕上的其他任何地方都没有。
    【解决方案3】:

    这是因为您可以在不使用

    的情况下添加数据

    notifyDataSetChanged();

    我花了 2 个小时在上面!。

    【讨论】:

    • 但我正在使用它:“ mMessageAdapter.notifyDataSetChanged();”
    • 确保你在设置新数据后通知适配器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    相关资源
    最近更新 更多