【问题标题】:Updating Values in Parent RecyclerView from a Child RecyclerView从子 RecyclerView 更新父 RecyclerView 中的值
【发布时间】:2018-02-19 09:59:07
【问题描述】:

我有两个 RecyclerView。 RecyclerView A 和 RecyclerView B。 RecyclerView A 包含 RecyclerView B 和一个 TextView。也就是说 RecyclerView B 是 RecyclerView A 的子节点。

如何在 RecyclerView B 的每个项目中按按钮时更新 RecyclerView A 中 TextView 的值。 TextView 属于 RecyclerView A 的 Item。

【问题讨论】:

  • TextView 使用 Sqlite 查询填充,该查询在名为 Database 的类中声明。所以在按钮单击时我需要运行该功能。此 sql 查询使用某种算法返回字符串

标签: android android-recyclerview


【解决方案1】:

您必须在 RecyclerView A 的 onBindViewHolder 中对 RecuclerView B 进行膨胀,只有您可以在 RecyclerViewB 的适配器中传递特定 RecyclerViewA 的子项的位置。我假设您可以访问 RecyclerView A 的 LayoutManager 和 RecyclerView 实例。

RecyclerViewA 的 onBindViewHolder:

@Override
public void onBindViewHolder(final ViewHolder holder, int positionInRecyclerViewA) {
    RecyclerViewAdapterB adapterB = new RecyclerViewAdapterB(positionInRecyclerViewA);
    holder.recyclerViewB.setAdapter(adapterB);
}

RecyclerViewB 的 onBindViewHolder:

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
    holder.button.setOnClickListener(new OnClickListener(){
        public void onClick(View view) {
            onButtonClick();
        }
    }
}
private void onButtonClick() {
    if (positionInRecyclerViewA >= linearLayoutManagerA.findFirstVisibleItemPosition() &&
            positionInRecyclerViewA <= linearLayoutManagerA.findLastVisibleItemPosition()) {
        Adapter.ViewHolder holder = (Adapter.ViewHolder) recyclerViewA
                .findViewHolderForAdapterPosition(positionInRecyclerViewA);
        holder.textView.setText("text");
    }
}

同时更新您的列表,以便下次滚动时它会包含最新数据。

【讨论】:

    【解决方案2】:

    在 recyclerView2 适配器中使用这个.. 并声明.. public static RecyclerViewAdapterOne reyclerViewAdapOne = ...;在 recylerView 2 适配器 的按钮的活动和onClick() 中使用Activity.reyclerViewAdapOne.updateValue(newText); 并在RecyclerViewAdapterOne 中添加此功能..

    updateValue(String newText) //updating the recycler adapter of recyclerview one
    
      { 
        this.list.set( your_index, newText); // i assume this is a generic string list
        this.notifyDataSetChanged();
    
        }
    

    【讨论】:

      【解决方案3】:

      接收您的活动/片段中的按钮点击或您喜欢的点击监听器。更改保存文本的资源(通常在您设置给适配器的数据集中,每个项目都应该知道要显示哪些文本)。在 RecyclerView A 上调用 notifyDataSetChanged()。

      【讨论】:

        【解决方案4】:

        使用EventBus,发布事件并在主Activity上订阅并通知适配器

        【讨论】:

          【解决方案5】:

          将两个适配器放在一个类中。将父位置和 RecyclerViewB 列表从 RecyclerViewA 适配器发送到 RecyclerViewB 适配器。然后从 RecyclerViewB 适配器通知 RecyclerViewA。

          父模型:

           public class ExampleModel {
          
                  public int text = 0;
          
                  public List<Button> child_lst;
              }
          

          在您的活动中:

          public class TestActivity extends AppCompatActivity {
          
              RecyclerView recyclerView_A;
              List<ExampleModel> parent_lst;
          
              @Override
              protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.activity_test);
          
                  recyclerView_A.setLayoutManager(new LinearLayoutManager(this));
                  recyclerView_A.setAdapter(new AAdapter());
          
              }
          
          
              public class AAdapter extends RecyclerView.Adapter <AAdapter.Aviewholder> {
          
                  @Override
                  public void onBindViewHolder(Aviewholder holder, int position) {
          
                      ExampleModel em = parent_lst.get(position);
          
                      holder.textView.setText(em.text+"");
          
                      holder.recyclerView_b.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
                      holder.recyclerView_b.setAdapter(new BAdapter(em.child_lst,position));
          
                  }
          
                  @Override
                  public int getItemCount()
                  {
                      return parent_lst.size();
                  }
              }
          
              public class BAdapter extends RecyclerView.Adapter <BAdapter.Bviewholder> {
          
                  List<Button> child_lst;
                  int parent_position;
          
          
                  public BAdapter(List<Button> child_lst,int parent_position){
          
                      this.child_lst = child_lst;
                      this.parent_position = parent_position;
          
                  }
          
          
                  @Override
                  public void onBindViewHolder(Bviewholder holder,  int position) {
          
                      holder.btn.setOnClickListener(new View.OnClickListener() {
                          @Override
                          public void onClick(View v) {
                              parent_lst.get(parent_position).text += 1;
                              recyclerView_A.getAdapter().notifyItemChanged(parent_position);
                          }
                      });
          
                  }
          
                  @Override
                  public int getItemCount()
                  {
                      return child_lst.size();
                  }
          
              }
          
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-06-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-07-17
            相关资源
            最近更新 更多