2016-10-17 2 views
1

RecyclerView를 구현하기위한 예제 코드를 가져 왔지만이를 내 응용 프로그램의 Child Fragment에서 작동하도록 조 변경하려고했습니다.안드로이드 | ViewHolder

코드는 아래 '만들기 목록 - 예'는 Creating Lists and Cards

내 어댑터에 문제로 실행 .. 먼저

public static class ViewHolder extends RecyclerView.ViewHolder { 
     // each data item is just a string in this case 
     public TextView mTextView; 
     public ViewHolder(TextView v) { 
      super(v); 
      mTextView = v; 
     } 
    } 

> @Override 
>  public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 
>             int viewType) { 
>   View v = LayoutInflater.from(parent.getContext()) 
>        .inflate(R.layout.my_text_view, parent, false); 
>   ViewHolder vh = new ViewHolder(v); 
>   return vh; 
>  } 

, 내가 생성자를 호출하고 불평 구축하지 않습니다 생성자가 TextView를 기대할 때 View가있는 ViewHolder. 코드를 보면 동의합니다! 하지만 공식적인 예입니다. 맞을 것 같습니까?

예제와 비교할 때 내 버전과 다른 점은 무엇입니까? 내가 생각할 수있는 두 가지 ...

1) 레이아웃 my_text_view는 예제에 나와 있지 않으므로 직접 작성했습니다. 내가 바르게 만들었 니?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <TextView 
    android:id="@+id/t_title" 
    android:title="title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"/> 

</LinearLayout> 

2) 나는 내 아이의 조각에서 어댑터를 호출하고, 그리고 예를 염두에 조각 작성되지 않았습니다. 내가 이해할 수있는 것보다 더 많이 물었을 것입니다.

여전히 이해할 수있는 한이를 통해 작업하십시오. 내 'OnCreateViewHolder'로 들어오는 '부모'가 내 RecyclerView입니까?

'v'는 'my_text_view'의 LinearLayout이어야합니까?

'ViewHolder'는 내 xml에서 TextView와 동일한 mTextView 속성을 가진 클래스가되어야합니다.

내가 어떻게 v = LinearLayout에서 TextView로가는지도 모르겠다 ??

누군가는이 멍청한 놈에게 설명하는 것을 돕고 싶습니까 ??

+0

예, 약간의 차이가 있습니다. 'ViewH' 생성자를'View v'로 바꾸고'(TextView) v.findViewById (R.id.t_title)'를 사용하여'TextView'를 얻으십시오. –

답변

3

예가 그리 좋지 않습니다. 두 개의 서로 다른 프로젝트가 서로 연결되어있는 것처럼 보입니다. 그것은이 같은 것을해야한다 :

public class MyAdapter extends RecyclerView.Adapter { 
    public static class ViewHolder extends RecyclerView.ViewHolder { 
      public TextView mTextView; 
      public ViewHolder(View v) { 
       super(v); 
       mTextView = (TextView) v.findViewById(R.id.t_title); 
      } 
     } 

     @Override 
     public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_text_view, parent, false); 
     ViewHolder vh = new ViewHolder(v); 
     return vh; 
     } 
    } 

이 부분을 설명하기 위해 :

onCreateViewHolderRecyclerView 요구 ViewHolder 새로운 유형의 생성 언제든지 호출되는 방법이다. 이 방법은 화면을 덮을 충분한 뷰를 얻기 위해 십여 번 정도 호출 될 수 있으며 뷰 유형이 많은 경우 꽤 많이 호출 될 수 있습니다.

이 경우 parent 매개 변수는 함께 표시되는 RecyclerView이됩니다. 그냥 RecycerView으로 만드는 것이 어떨까요? Google 디자이너는 ViewGroup이어야한다고 결정했기 때문에 또한 Adapter 패턴이므로 보장해야 할 것은 ViewGroup입니다 (RecyclerView가 아닐 수도 있으므로 해당 가정을 사용하여 어댑터를 작성하면 안됩니다). 현실적으로, 그것은 거의 항상 RecyclerView 일 것입니다.

매개 변수 int viewType은 어떤 종류의 뷰를 작성하고 있는지 알려주는 역할을합니다.어댑터의 getItemViewType() 메소드를 대체하면이 값이 결정됩니다. 한 가지 유형의보기 만 있으면 걱정할 필요가 없습니다.

ViewHolder의 경우 기본적으로 레이아웃에 여러 유형의보기가 캐시됩니다. 이들은 ImageView, TextView 등이 될 수 있습니다. 사용자가 스크롤 할 때마다 지속적으로 "재활용"되어 항상 생성되는 것은 아닙니다. 그렇게하면 현재 정보로보기 만 업데이트하면됩니다. 이 경우 title이 있습니다. bindViewHolder에 전달 된 ViewHolder는 실제 업데이트가 이루어지는 곳입니다. 이것은 항상 호출되므로 onCreateViewHolder의 뷰를 초기화 할 필요가 없습니다. 그냥 그들을 만들어야합니다.

+0

정말 고마워요. 당신이 제공 한 모든 추가 설명에 대해, 모든 것이 훨씬 더 명확 해집니다. 멋진 대답. 소스가 무엇이든간에 예제가 정확하다고 가정해서는 안되는 방법을 보여 주기만하면됩니다. Mike에게 (TextView) 캐스트도 제공합니다. – Esby

관련 문제