2015-05-13 3 views
5

Я пытаюсь создать recyclerview в навигационном ящике с заголовком, отображающим информацию профиля. Я хотел бы иметь высоту заголовка больше, чем другие элементы строки. Ниже мой макет заголовкаКак иметь переменную высоту строки в recyclerview

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="200dp" 
    android:background="@color/green" 
    android:orientation="vertical" 
    android:weightSum="1"> 



    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="56dp" 
     android:orientation="vertical" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true"> 

     <TextView 
      android:id="@+id/name" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="16dp" 
      android:textColor="#ffffff" 
      android:text="XXXXX" 
      android:textSize="32sp" 
      android:textStyle="bold" 
      /> 

    </LinearLayout> 

</RelativeLayout> 

Когда я установил это в заголовке зрения ресайклера, высота 200dp не отражает в пользовательском интерфейсе

RecyclerView.Adapter<NavDrawerListViewHolder> adapter = new NavDrawerListAdapter(this,TITLES,this); 
     navList.setAdapter(adapter); 

Ниже адаптер для recyclerview:

public class NavDrawerListAdapter extends RecyclerView.Adapter<NavDrawerListViewHolder> { 

    private static final int TYPE_HEADER = 0; 
    private static final int TYPE_ITEM = 1; 
    Context mContext; 
    String[] mCharacterList; 
    IListItemClickListener mListener; 
    int holderViewType=0; 

    public NavDrawerListAdapter(Context context, String[] characters, IListItemClickListener clickListener) { 
     mContext = context; 
     mCharacterList = characters; 
     mListener = clickListener; 
    } 

    @Override 
    public NavDrawerListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     NavDrawerListViewHolder viewHolder; 
     holderViewType = viewType; 
     if(viewType == TYPE_HEADER) { 
      View v = LayoutInflater.from(mContext).inflate(R.layout.header,null); 
      viewHolder = new NavDrawerListViewHolder(v,TYPE_HEADER,mListener); 
     } else { 
      View v = LayoutInflater.from(mContext).inflate(R.layout.nav_item_row,null); 
      viewHolder = new NavDrawerListViewHolder(v,TYPE_ITEM,mListener); 
     } 

     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(NavDrawerListViewHolder holder, int position) { 
     if(holderViewType == TYPE_HEADER) { 
      Typeface typeface = Typeface.createFromAsset(mContext.getAssets(), "Roboto-Thin.ttf"); 
      holder.name.setTypeface(typeface); 
     } else { 
      holder.characterName.setText(mCharacterList[position - 1]); 
     } 

    } 

    @Override 
    public int getItemViewType(int position) { 
     if (position == 0) { 
      return TYPE_HEADER; 
     } 

     return TYPE_ITEM; 
    } 

    @Override 
    public int getItemCount() { 
     return mCharacterList.length + 1; 
    } 

ответ

14

Заменить:

LayoutInflater.from(mContext).inflate(R.layout.header,null); 

с:

LayoutInflater.from(mContext).inflate(R.layout.header, parent, false); 

и тот же для всех других inflate() вызовов. Если вы знаете родительский контейнер для раздутого макета, всегда отправляйте его на звонок inflate(). В частности, это требует RelativeLayout, если это корневой вид раздутого макета.

Кроме того, рассмотрите возможность использования getLayoutInflater() на Activity вместо LayoutInflater.from(). Возможно, если вы передадите Activity в from(), вы получите эквивалентные результаты. Однако, в общем, вы всегда хотите использовать LayoutInflater, который знает о Activity и его теме, поэтому вы получите правильные результаты.

Смежные вопросы