2016-08-02 53 views
0

我有一个RecyclerView与定制Adapter有一个列表。每个列表中的元素有一个复选框是在自定义Adapter中,我用手柄:如何引用Android中两个布局的元素?

holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

当按下复选框来检测。

问题是,我也有一个按钮,但它是从视图的类处理。在这一类我可以引用其中的按钮布局,像这样:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     final View buttonInflater = inflater.inflate(R.layout.fragment_button,null); 

但在自定义适配器,我不能做到这一点。我要做的:

public MyItemHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); 

所以有一次我有参考在各自的班级两种布局,我认为我可以提及的View类引用也是其在定制适配器布局的按钮。与此类似:

public MyItemHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); 
    View buttonView = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_button, parent, false); 

但是当我尝试引用按钮时,它似乎不被引用。

为什么我想从我的自定义适配器观点

引用按钮,因为我想,每个复选框被选中一个单位时间将被添加到按钮上的文字。例如,我第一次选择按钮上的列表的复选框,文本应该是1,第二次是2,依此类推。

这是我对我的自定义接口的代码时,我按复选框:

int sum = 0; 

holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if(buttonView.isChecked()){ 
       sum = sum + 1; 
       checkBox.setText("" + sum); 
      }else{ 
       sum = sum - 1; 
       checkBox.setText("" + sum); 
      } 
     } 
}); 

但这个按钮犯规写任何东西。

如何在按钮上书写?

在此先感谢!

回答

1

我会说这是不好的设计,因为问题的分离,直接在列表适配器中引用按钮。如果你真的想这样做,你不应该尝试重新按钮。你应该做的是在你的列表适配器上添加属性(或setter),这是对按钮的引用。然后,当你创建你的列表适配器,设置按钮到它:

final View buttonInflater = inflater.inflate(R.layout.fragment_button,null); 
mListAdapter.setButton(buttonInflater); 

然后在您的自定义适配器:

private Button mButton; 
public void setButton(Button button) { 
    mButton = button; 
} 

您认为这些持有人,你必须将按钮的引用:

holder.checkBox.setOnCheckedChangeListener(setOnClickListener(new CompoundButton.OnCheckedChangeListener() { 

         @Override 
         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
          mButton.setText(...); 
         } 
        }); 

但是,我强烈建议使用回调模式。即,类似于您可以实施AdapterView.OnItemClickListenerhttps://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html)的方式,您可以创建一个自定义界面,如ItemCheckChangedListener。如果你喜欢,它甚至可以匹配CompoundButton.OnCheckedChangeListener的定义。但基本上只需将您的类(它具有按钮和RecyclerView)设置为OnCheckedChangeListener。然后,每当复选框状态发生变化时,回调您创建的监听器。然后在那里你可以访问按钮,所以你可以更新它的状态。

+0

只是一个问题。你在哪里定义'mButton'变量? –

+0

谢谢!我知道了!谢谢你的建议发送到定制适配器inflater,这是诀窍:) –

+1

太好了。对不起,我已经更清楚地更新了我的答案(尽管你已经明白了)。 –