android - 根据 RecyclerView 每行中的数据类型膨胀行 View

标签 android android-recyclerview

我目前正在开发一个 android 项目,其中有一个 Recyclerview。 Recyclerview 持有不同类型的项目。项目是不同的文件(Doc、Pdf、图像和视频)。我正在使用 Gridlayoutmanager。我想将两种类型的 View 膨胀为 recyclerview 中的行,一种 View 用于图像和视频,另一种 View 用于其他类型的文件(doc、pdf 等)。全部文件是混合的,不知道哪种类型的文件顺序。我知道我必须使用 getItemViewTypeonCreateViewHolder 来膨胀行。如果我使用先膨胀行并根据膨胀的行类型填充行的一般方法不起作用,因为所有文件都是随机的。我想根据文件类型扩大行。可能是我需要从 onBindViewHolder 触发 getItemViewType 以便膨胀所需的类型。我已经阅读了SO中的问题。没有问题与此问题直接相关。所有的问题都是先膨胀行并在行中填写详细信息。知道如何根据详细信息的类型(在我的案例中是文件)进行膨胀吗?

最佳答案

在你内部创建适配器类:

 class ViewHolder{

     public ViewHolder(View v, int type){

         super(itemView);
         this.type=type; //here we have type of view holder
     }
 }

在Adapter中实现方法:

final int VIEW_VIDEO=2;
final int VIEW_STANDARD=1; 
public int getItemViewType(int position) {

    //here return some view type
    if (isVideo(position)){ //example method checking is video row

       return VIEW_VIDEO;
    }else{

       return VIEW_STANDARD
    }
}

If I use general way which is inflating the row first and filling the row according to the type of row inflated does not work because all the files are random

getItemViewType 中您有位置,所以也许这是可以检查此行中的文件类型的时候。如果您的适配器有数据(如果列表显示则肯​​定有),那么可以检查我们需要在 View 上设置哪种文件。

示例 isVideo 方法检查文件扩展名:

 private boolean isVideo(position){

    String filename=list.get(position); //list Your Strings
    String filenameArray[] = filename.split("\\.");
    String extension = filenameArray[filenameArray.length-1];
    return extension=="mp4"; //change this to more flexible
 }

下一个在 Adapter 中实现的方法:

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){

   View v;

   if (viewType==VIEW_VIDEO){

      v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.video_layout, parent, false);
   }else{

       v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.standard_layout, parent, false);
   }

   return new ViewHolder(v,viewType); //here we have view holder with right view

}

适配器中的最后一件事:

public void onBindViewHolder(final ViewHolder holder, int position){

    if (holder.type==VIEW_VIDEO){

       //staff on video
    }
}

关于android - 根据 RecyclerView 每行中的数据类型膨胀行 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38675735/

相关文章:

android - 如何以正确的方式组织 Realm 存储结构

android - RecyclerView 项目动画,onAnimationFinished 被调用,但没有 onAnimationStarted。为什么?

java - 如何在android中获取和设置简单的数学函数?

android - 在 SIPDROID 中更改服务器

android - 无法从 Android 客户端调用 C# .net Web 服务方法

android - ViewHolder 中的 kotlin-android-extensions

java - 当我更改文本并将其显示在线程中的 UI 上时,什么也没做(JAVA)

java - 线性布局点击不起作用,我做错了什么?

android - 如何在适配器的 Kotlin 中提供长点击监听器

android - RecyclerView 混淆项目