2016-09-13 1 views
1

나는 안드로이드 데이터 바인딩을 사용하여 ViewPager을 구현했으며 데이터 및 클릭 이벤트와 완벽하게 작동합니다.데이터 바인딩이있는 ViewPager 항목의 위치

난 내가 어댑터 생성자에서 itemClickListener을 보내고 내 instantiateItem()

@Override 
public Object instantiateItem(ViewGroup container, final int position) { 
    ListItemBinding binding = DataBindingUtil.inflate(mLayoutInflater, R.layout.list_item, container, false); 
    binding.setHandler(itemClickListener); 
    binding.getRoot().setTag(position); 
    container.addView(binding.getRoot()); 
    return binding.getRoot(); 
} 

PagerAdapter

public interface ItemClickListener { 
    public void onItemClick(); 
} 

은 여기 클릭 이벤트에 대한 interface을 만들었습니다. 여기

public MatchListAdapter(Context context, ItemClickListener itemClickListener) { 
    mContext = context; 
    mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    this.itemClickListener= itemClickListener; 
} 

내 지금 list_item.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 

    <data> 
     <variable 
      name="handler" 
      type="com.example.ItemClickListener" /> 
    </data> 

    <LinearLayout 
     android:id="@+id/root_viewItem" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:onClick="@{() -> handler.onItemClick()}" 
     android:orientation="vertical"> 

     //rest views and controls. 

    </LinearLayout> 
</layout> 

문제는 내가 클릭 한 항목의 위치를 전달하려는 것입니다이다, 어떻게 XML에서 그 위치를 전달하는 방법? 내가 xml에서 내 메서드를 호출하여 위치를 전달하는 방법은 무엇입니까?

답변

3

당신은 이미

binding.getRoot().setTag(position); 

을하고있는 태그에 설정된 위치보다 인터페이스

public interface ItemClickListener { 
    public void onItemClick(View view); 
    } 

에서보기를 통과 할 수 있습니다 당신은이

@Override 
public void onItemClick(View view){ 
    int position=(int)view.getTag(); 
} 
같은 것을보기 PARAM에서 위치를 얻을 수있는 것보다

자세한 내용은 http://developers-club.com/posts/267735/

을 참조하십시오.

android:onClick="@{() -> handler.onItemClick(rootItemView.getTag().toString())}" 

을 그리고 물론 당신은 당신의 인터페이스 방법과 그 구현을 수정해야합니다 :

+0

에서 위치 값을 설정합니다 에서 내 견해 xml? –

+0

'DataBinding'은 xml의 뷰 매개 변수를 전달할 필요가 없다는 것을 처리합니다. –

+0

감사합니다, 그것은 작동합니다 :) –

1

이처럼 람다 식의 매개 변수를 전달할 수 있습니다

public void onItemClick(String data); 
+0

감사합니다, 그것은 또한 유용하며 잘 작동합니다 :) –

1

가 모두 대답은 나에게 도움을 그리고 둘 다 일하고있다, 나는 다른 길을 찾았지만, 조금 길다.

list_item.xmlInteger 변수를 하나 더 가져 와서 그 값을 어댑터에서 설정했습니다.

<data> 
    <variable 
     name="position" 
     type="Integer"/> 
</data> 

다음 인터페이스이

public interface ItemClickListener { 
    public void onItemClick(int position); 
} 

모양을

android:onClick="@{() -> handler.onItemClick(position)}" 
onItemClick에 전달 내가 얻을 수있는 방법 instantiateItem()

@Override 
public Object instantiateItem(ViewGroup container, final int position) { 
    ListItemBinding binding = DataBindingUtil.inflate(mLayoutInflater, R.layout.list_item, container, false); 
    binding.setHandler(itemClickListener); 
    binding.setPosition(position); 
    binding.getRoot().setTag(position); 
    container.addView(binding.getRoot()); 
    return binding.getRoot(); 
} 
+0

내 대답은 더 안정적이고 덜 복잡하다고 생각합니다. –

+0

@BurhanuddinRashid 네, 제 대답이 약간 길다는 것을 알고 있습니다. –

+0

대답으로 받아 들여야한다고 생각하지 않습니까? –