2016-08-02 1 views
0

나는 목록이있는 AdapterRecyclerView 사용자 지정이 있습니다. 확인란을 누를 때Android에서 두 레이아웃의 요소를 참조하는 방법은 무엇입니까?

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

가 감지 할 수 : 목록에있는 각 요소는 사용자 지정 내가 사용하는 Adapter에 핸들이있는 체크 박스가 있습니다.

문제는 단추가 있지만보기 클래스에서 처리된다는 것입니다. 이 클래스에서는 버튼이있는 레이아웃을 다음과 같이 참조 할 수 있습니다.

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

그래서 한 번 내가 참조를 해당 클래스에서 모두 레이아웃을 가지고, 나는 또한보기 클래스 참조 사용자 정의 어댑터의 레이아웃의 버튼에 대한 참조를 만들 수 있다고 생각했다. 이 유사 :

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

관심사가 분리되어 있기 때문에 목록 어댑터에서 버튼을 직접 참조하는 것이 좋지 않은 디자인이라고 할 수 있습니다. 정말로하고 싶다면 버튼을 다시 부풀려서는 안됩니다. 당신이해야 할 일은 버튼에 대한 참조 인 속성 (또는 세터)을 목록 어댑터에 추가하는 것입니다. 사용자 정의 어댑터에서 다음

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.OnItemClickListener (https://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html)을 구현하는 것과 비슷한 방법으로 ItemCheckChangedListener과 같은 맞춤 인터페이스를 만들 수 있습니다. 원하는 경우 CompoundButton.OnCheckedChangeListener의 정의와 일치 할 수도 있습니다. 하지만 기본적으로 OnCheckedChangeListener로 버튼과 RecyclerView가있는 클래스를 설정하기 만하면됩니다. 그런 다음 체크 박스 상태가 변경 될 때마다 생성 한 리스너를 콜백합니다.그런 다음 버튼에 액세스 할 수 있으므로 상태를 업데이트 할 수 있습니다.

+0

그냥 질문입니다. 'mButton' 변수는 어디에 정의합니까? –

+0

감사합니다. 알 겠어! 맞춤형 어댑터에 인포 더를 보내 주시길 부탁드립니다. 트릭이었습니다. :) –

+1

좋아요. 죄송합니다. 그래도 대답을 좀 더 명확하게 업데이트했습니다 (비록 알아 냈지만). –

관련 문제