如何在Android中引用两个布局中的元素?

时间:2016-08-02 13:02:28

标签: android

我有一个RecyclerView,其自定义Adapter有一个列表。列表中的每个元素都有一个复选框,可以在我使用的自定义Adapter处理:

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

检测何时按下复选框。

问题是我也有一个按钮,但它是从View的类中处理的。在本课程中,我可以参考按钮所在的布局,如下所示:

 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 个答案:

答案 0 :(得分: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。然后,每当更改复选框状态时,回调您创建的侦听器。然后在那里你可以访问该按钮,这样你就可以更新它的状态了。