Android 使用实时数据库时使用不同的RecyclerView项布局
我希望在单击recyclerview中的某个项目后,使用不同的数据(并采用不同的布局)填充recyclerview。用于填充recyclerview的数据来自firebase实时数据库。单击项目时,recyclerview应该显示所选节点的子节点。而不是开始一项新的活动和膨胀一个全新的布局。我想尝试更改单个布局的一部分。我认为在渲染、内存和电池性能方面可能会有性能优势(而且apk更小,因为要包含的文件更少)。我知道我需要分析代码,并将其与我有多个活动的情况进行比较,但首先我希望让代码在数据库中上下移动。My MainFragment包含一个侦听器,该侦听器在recyclerview的适配器类中调用(如下所示) 它在Adapter.ViewHolder.onClick()中调用(如下所示) 当我单击一个recycler视图项并且需要用数据重新填充recyclerview时,会出现致命错误,但是没有数据(尚未),我在Adapter.onBindViewHolder中得到一个索引越界异常。它就像childEventListener一样,即使在我创建的侦听器中重新启动它(它最初是在MainFragment.onCreate()中创建的),也不会被重置Android 使用实时数据库时使用不同的RecyclerView项布局,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我希望在单击recyclerview中的某个项目后,使用不同的数据(并采用不同的布局)填充recyclerview。用于填充recyclerview的数据来自firebase实时数据库。单击项目时,recyclerview应该显示所选节点的子节点。而不是开始一项新的活动和膨胀一个全新的布局。我想尝试更改单个布局的一部分。我认为在渲染、内存和电池性能方面可能会有性能优势(而且apk更小,因为要包含的文件更少)。我知道我需要分析代码,并将其与我有多个活动的情况进行比较,但首先我希望让代码在数据库中上
单击按钮后,如何让数据库发送新数据(其他一切似乎都正常,使用了新的布局资源,我需要的只是数据来填充recyclerview)?您认为C++中编写代码的这一部分并手动删除(然后创建)对DavaSeReRealEngRebug和CyrDeNistListNER对象的引用是否有效?< P>看起来您有一个直接从后台数据源(FiasBase:FiBase')更新您的DevestReVIEW内容的协议。p> 最佳做法是收集需要在RecyclerView in background线程中显示的所有数据,并将其保存到UI线程上的本地副本(本地ArrayList或Map,取决于您的数据结构),并且仅在使用
notifyDataSetChanged()
或其他更新方法从适配器请求内容更新之后
在您的代码中,我还发现了冗余调用:
jokedapter.notifyItemInserted(jokes.size()-1);
notifyDataSetChanged();
在调用notifyItemInserted()
之后,不需要立即调用notifyDataSetChanged()
,因为第一次更新应该更新适配器中从指定位置到最后一个位置的所有项。另外调用notifyDataSetChanged
只会重复更新,但对所有项目都是如此
@Override
public void setItemLayoutResuorce(String key) {
Log.i("Hilarity", "SILR");
mMessagesDatabaseReference = mMessagesDatabaseReference.child(key);
Log.i("Hilarity", mMessagesDatabaseReference.getKey());
mChildEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
if (mMessagesDatabaseReference.getKey().equals(getString(R.string.languages))) {
String langauge = dataSnapshot.getKey();
languages.add(langauge);
jokeAdapter.notifyItemInserted(languages.size() - 1);
jokeAdapter.notifyDataSetChanged();
Log.i("Hilarity", "languages add");
} else {
Log.i("Hilarity", "joke added");
Joke joke = dataSnapshot.getValue(Joke.class);
jokes.add(joke);
jokeAdapter.notifyItemInserted(jokes.size() - 1);
jokeAdapter.notifyDataSetChanged();
}
}
public void onChildChanged(DataSnapshot dataSnapshot, String s) {}
public void onChildRemoved(DataSnapshot dataSnapshot) {}
public void onChildMoved(DataSnapshot dataSnapshot, String s) {}
public void onCancelled(DatabaseError databaseError) {}
};
mMessagesDatabaseReference.addChildEventListener(mChildEventListener);
jokeAdapter = new JokeAdapter(getActivity(), jokes, languages, this, true);
recyclerview.setAdapter(jokeAdapter);
@Override
public void onClick(View view){
if (view instanceof TextView) {
showJokes = true;
TextView textView = (TextView) view;
rvc.setItemLayoutResuorce(textView.getText().toString());
}
}