2016-08-02 50 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

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