RecyclerView不会在视图之间切换

时间:2015-03-25 19:05:48

标签: android navigation-drawer android-recyclerview android-viewholder recycler-adapter

我正在尝试使用标题构建导航抽屉。我已经完成了一个例外。首先,我将简要介绍一下结构,然后确定问题。 结构如下:

  1. 我有2个布局文件,一个用于抽屉标题视图,名为 header_row.xml 。它包含两个小部件,textview和imageview。方向是垂直的,因此viewitem将在textview下具有imageview设置。此布局中的textview是标题文本,imageview是一个水平线,位于该标题文本下方,作为简单的分隔符。

  2. 第二种布局是抽屉可点击的项目。它还包含两个小部件,一个textview和一个imageview。 textview是可点击的项目。而imageview就是该项目的图标。此布局是水平的,因此图标位于项目的左侧。此布局称为 data_row.xml

  3. 这两个布局文件背后的目标是(试图想象一下)是带有标题的回收者视图。

    我的Recycler适配器代码如下:

    package com.android.yousef.tm;
    
    import android.graphics.drawable.Drawable;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    /**
    * Created by Yousef on 3/3/2015.
    */
    public class MyRecyclerAdapter extends  
    RecyclerView.Adapter<RecyclerView.ViewHolder> {
    
    String[] texts; //An array of the text elements that contains both header 
    //text and items text
    
    int[] imgs; // An array of the image elements that contains both headers 
    //dividers and items icons.
    
    // NOTE THAT, THE DATA IN THE ABOVE ARRAYS ARE ARRANGE IN ORDER SO THAT 
    //POSITIONS 0, 3, AND 5 WILL
    // CONTAIN HEADER'S TEXT AND DIVIDER'S IMAGE RESOURCES
    
    
    private ClickListner clickListner; // Ignore this
    
    //My constructor as bellow getting data from the NavigationDrawer.java class
    
    public MyRecyclerAdapter(String[] texts, int[] imgs) {
        this.texts = texts;
        this.imgs = imgs;
    }
    
    
    // Ignore the listner
    public void setClickListner(ClickListner clickListner) {
        this.clickListner = clickListner;
    }
    
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int  i) {
    
        // positions 0,3,and 5 are my headers positions
        if(i == 0 || i == 3 || i ==5)
        {
            // if the current position is a header's position then return a  
            //header_row item
    
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.header_row, viewGroup, false);
            return new VHHeader(view);
        }
        else {
            // if the current position is not a header's position then return an  
            //item_row item
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.data_row, viewGroup, false);
            return new VHItem(view);
        }
    }
    
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
    
        // if the current position is a header's position then set header's 
        //value: text and divider
    
        if(viewHolder instanceof VHHeader)
        {
            ((VHHeader) viewHolder).header.setText(texts[i]);
            ((VHHeader) viewHolder).divider.setImageResource(imgs[i]);
        }
    
        // if the current position is not a header's position then set item's 
        //value: text and icon
    
        else if(viewHolder instanceof VHItem)
        {
            ((VHItem) viewHolder).title.setText(texts[i]);
            ((VHItem) viewHolder).icon.setImageResource(imgs[i]);
        }
    }
    
    @Override
    public int getItemCount() {
        //total rows in my recycler view including header and clickable items.
        return 8;
    }
    
    //Ignore the interface
    public interface ClickListner {
    
        public void itemClicked(View v, int position);
    }
    
    // My Item's ViewHolder class.
    class VHItem extends RecyclerView.ViewHolder {
        TextView title;
        ImageView icon;
    
        public VHItem(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.list_txt_data);
            icon = (ImageView) itemView.findViewById(R.id.list_img_data);
        }
    }
    
    // My Header's ViewHolder class
    class VHHeader extends RecyclerView.ViewHolder {
        TextView header;
        ImageView divider;
    
        public VHHeader(View itemView) {
            super(itemView);
            header = (TextView) itemView.findViewById(R.id.list_txt_header);
            divider = (ImageView) itemView.findViewById(R.id.list_img_header);
        }
    }
    

    }

    问题是,Recycler视图总是采用第一行布局(在我的例子中为header_row.xml)并将其用于所有关于其位置的行,因此类型为标题(header_row.xml用户)或项目(data_row.xml)用户)。

    请帮忙吗?谢谢。

1 个答案:

答案 0 :(得分:0)

我找到了解决方法。我不得不重写另一个方法:getViewItemType();在适配器中,以检查getView()的标头位置;水平。因此,只需将以下内容添加到原始问题中的代码中:

@Override
public int getItemViewType(int position) {
    if(position == 0 || position == 3 || position ==5)
    {
     HEADER = position;
        return HEADER;
    }
    else {
        ITEM = position;
        return ITEM;
    }
}

请确保声明HEADER AND ITEM。