好的。所以我遇到的问题与此线程中的问题非常相似(尽管该解决方案对我不起作用):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/