我目前正在开发一个 android 项目,其中有一个 Recyclerview
。 Recyclerview 持有不同类型的项目。项目是不同的文件(Doc、Pdf、图像和视频)。我正在使用 Gridlayoutmanager
。我想将两种类型的 View 膨胀为 recyclerview 中的行,一种 View 用于图像和视频,另一种 View 用于其他类型的文件(doc、pdf 等)。全部文件是混合的,不知道哪种类型的文件顺序。我知道我必须使用 getItemViewType
和 onCreateViewHolder
来膨胀行。如果我使用先膨胀行并根据膨胀的行类型填充行的一般方法不起作用,因为所有文件都是随机的。我想根据文件类型扩大行。可能是我需要从 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/