2017-07-19 49 views
0

我想在点击回收站视图中的项目后用不同的数据填充recyclerview(并采用不同的布局)。用于填充回收站视图的数据来自Firebase实时数据库。当一个项目被点击时,recyclerview应该显示所选节点的子项。而不是开始一个新的活动,并扩大一个全新的布局。我想尝试更改单个布局的一部分。我认为在渲染,内存和电池性能方面可能会有性能优势(并且由于包含的文件较少,所以apk也较小)。我知道我需要剖析代码并将其与我有多个活动的情况进行比较,但首先我想要让代码在数据库中上下移动。我的MainFragment包含一个在Adapter类中为recyclerview调用的侦听器(如下所示)。在使用实时数据库时使用不同的RecyclerView项目布局

@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); 

这就是所谓的Adapter.ViewHolder.onClick()(如下图所示),当我点击一个回收视图项和recyclerview需要用数据重新填充

@Override 
    public void onClick(View view){ 
     if (view instanceof TextView) { 
      showJokes = true; 
      TextView textView = (TextView) view; 
      rvc.setItemLayoutResuorce(textView.getText().toString()); 
     } 
    } 

致命错误出现,但没有数据(还),我得到了一个索引超出了Adapter.onBindViewHolder的例外。它就像childEventListener一样,即使它在我创建的侦听器中得到重新使用(它最初是在MainFragment.onCreate()中创建的),也不会重置。

单击按钮后,如何才能让数据库发送新数据(其他一切似乎都正常,我使用的所有新布局资源都是填充recyclerview的数据)?你认为用C++编写代码的这一部分,并手动删除(然后创建)对DatabaseReference和ChildEventListener对象的引用会起作用吗?

回答

0

看起来好像你在后台线程中直接从数据源(在你的情况下是Firebase)更新RecyclerView内容。

最好的做法是收集您需要在后台线程中显示在您的RecyclerView中的所有数据,并将其保存到UI线程的本地副本(本地ArrayList或Map,取决于您的数据结构),并且仅在请求内容使用notifyDataSetChanged()或不同的更新方法从适配器更新。

而且在你的代码,我发现冗余呼叫:

jokeAdapter.notifyItemInserted(jokes.size() - 1); 
jokeAdapter.notifyDataSetChanged(); 

无需调用notifyDataSetChanged()调用notifyItemInserted()之后,作为第一个更新是从到最后一个指定位置更新适配器的所有项目。 notifyDataSetChanged的额外呼叫只是重复更新,但对于所有项目。

相关问题