【问题标题】:RecyclerView doesn't switch between viewsRecyclerView 不会在视图之间切换
【发布时间】:2015-03-25 19:05:48
【问题描述】:

我正在尝试构建带有标题的导航抽屉。我有一个例外。首先,我将提供有关结构的简要信息,然后确定确切的问题。 结构如下:

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

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

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

我的 Recycler Adapter 代码如下:

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

}

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

有什么帮助吗?谢谢。

【问题讨论】:

  • 也许 instanceof 工作不正常?作为替代方案,尝试在 onCreateViewHolder 上为视图设置标签并在 onBindViewHolder 中使用它们。
  • 我试过用“i”参数,那个视图的位置,还是不行。

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


【解决方案1】:

我找到了解决方案。我不得不重写另一个方法: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。

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    相关资源
    最近更新 更多