Java 如何在RecyclerView中创建异构布局?

Java 如何在RecyclerView中创建异构布局?,java,android,android-recyclerview,Java,Android,Android Recyclerview,我希望用户以任何顺序选择图像、pdf和任何其他文档,并将它们放入recyclerView。我有他们每个不同的布局 到目前为止,我从选定的图像或pdf中获取Uri和文件名,并将它们放入列表中 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCod

我希望用户以任何顺序选择图像、pdf和任何其他文档,并将它们放入recyclerView。我有他们每个不同的布局

到目前为止,我从选定的图像或pdf中获取Uri和文件名,并将它们放入列表中

@Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);

            if(requestCode == CHOOSE_IMAGE && resultCode == Activity.RESULT_OK){
    if (data.getData()!=null){
                    uriDocument = data.getData();
    }
    String filename = getFilename(uriDocument);
                    fileNameList.add(filename);
                    mAdapter.notifyDataSetChanged();
    }else if (requestCode == PICK_ATTACHMENT && resultCode == RESULT_OK && data != null && data.getData() != null){
                uriDocument= data.getData();
                String filename = getFilename(uriDocument);
                fileNameList.add(filename);
                mAdapter.notifyDataSetChanged();
            }
        } 
我有一个适配器类,它现在只包含一个布局:

@NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view;
        view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_image_message, parent, false);
        return new ViewHolder(view);
    }
这是getFilename()方法:


如何根据文档类型(即图像或pdf)制作两种不同的布局?

您应该有多种视图类型。我建议你使用更简单的方法。请参见其示例,但您可以编写如下类:

资料持有人:

@DataHolder
public class PdfDataHolder extends PrimeDataHolder {

    private String mFilePath;
    // ... other fields

    public PdfDataHolder(String filePath){
        mFilePath = filePath;
    }

    public String getFilePath() {
        return mFilePath;
    }
}

@DataHolder
public class ImageDataHolder extends PrimeDataHolder {

    private String mFilePath;
    // ... other fields

    public ImageDataHolder(String filePath){
        mFilePath = filePath;
    }

    public String getFilePath() {
        return mFilePath;
    }
}
观众:

public class PdfViewHolder extends PrimeViewHolder<PdfDataHolder> {

    private TextView textView;

    public PdfViewHolder(@NotNull PrimeDelegate delegate) {
        super(delegate, R.layout.list_item_pdf);
        textView = itemView.findViewById(R.id.textView);
    }

    @Override
    protected void bindDataToView(@NotNull PdfDataHolder dataHolder) {
        textView.setText(dataHolder.getFilePath());
    }

} 

public class ImageViewHolder extends PrimeViewHolder<ImageDataHolder> {

    private ImageView imageView;

    public ImageViewHolder(@NotNull PrimeDelegate delegate) {
        super(delegate, R.layout.list_item_image);
        imageView = itemView.findViewById(R.id.imageView);
    }

    @Override
    protected void bindDataToView(@NotNull ImageDataHolder dataHolder) {
        Glide.with(getContext()).load(dataHolder.getFilePath()).into(imageView);
    }

} 
公共类PdfViewHolder扩展PrimeViewHolder{
私有文本视图文本视图;
公共PdfViewHolder(@NotNull PrimeDelegate委托){
超级(代表,R.layout.list\u item\u pdf);
textView=itemView.findViewById(R.id.textView);
}
@凌驾
受保护的void bindDataToView(@NotNull PdfDataHolder dataHolder){
setText(dataHolder.getFilePath());
}
} 
公共类ImageViewHolder扩展了PrimeViewHolder{
私人影像视图;
公共ImageViewHolder(@NotNull PrimeDelegate委托){
超级(代表、右布局、列表、项目、图像);
imageView=itemView.findViewById(R.id.imageView);
}
@凌驾
受保护的void bindDataToView(@NotNull ImageDataHolder dataHolder){
Glide.with(getContext()).load(dataHolder.getFilePath()).into(imageView);
}
} 
适配器:

public class FileListAdapter extends PrimeAdapter {

    @Nullable
    @Override
    public PrimeViewHolder<?> makeViewHolder(@Nullable Class<?> dataHolderClass) {
        if (dataHolderClass == PdfDataHolder.class) {
            return new PdfViewHolder(this);
        } else if (dataHolderClass == ImageDataHolder.class) {
            return new ImageViewHolder(this);
        } else {
            return null;
        }
    }

}
公共类FileListAdapter扩展了PrimeAdapter{
@可空
@凌驾
公共PrimeViewHolder makeViewHolder(@Nullable类dataHolderClass){
if(dataHolderClass==PdfDataHolder.class){
返回新的PDFviewolder(此);
}else if(dataHolderClass==ImageDataHolder.class){
返回新的ImageViewHolder(此);
}否则{
返回null;
}
}
}

您应该有多种视图类型。我建议你使用更简单的方法。请参见其示例,但您可以编写如下类:

资料持有人:

@DataHolder
public class PdfDataHolder extends PrimeDataHolder {

    private String mFilePath;
    // ... other fields

    public PdfDataHolder(String filePath){
        mFilePath = filePath;
    }

    public String getFilePath() {
        return mFilePath;
    }
}

@DataHolder
public class ImageDataHolder extends PrimeDataHolder {

    private String mFilePath;
    // ... other fields

    public ImageDataHolder(String filePath){
        mFilePath = filePath;
    }

    public String getFilePath() {
        return mFilePath;
    }
}
观众:

public class PdfViewHolder extends PrimeViewHolder<PdfDataHolder> {

    private TextView textView;

    public PdfViewHolder(@NotNull PrimeDelegate delegate) {
        super(delegate, R.layout.list_item_pdf);
        textView = itemView.findViewById(R.id.textView);
    }

    @Override
    protected void bindDataToView(@NotNull PdfDataHolder dataHolder) {
        textView.setText(dataHolder.getFilePath());
    }

} 

public class ImageViewHolder extends PrimeViewHolder<ImageDataHolder> {

    private ImageView imageView;

    public ImageViewHolder(@NotNull PrimeDelegate delegate) {
        super(delegate, R.layout.list_item_image);
        imageView = itemView.findViewById(R.id.imageView);
    }

    @Override
    protected void bindDataToView(@NotNull ImageDataHolder dataHolder) {
        Glide.with(getContext()).load(dataHolder.getFilePath()).into(imageView);
    }

} 
公共类PdfViewHolder扩展PrimeViewHolder{
私有文本视图文本视图;
公共PdfViewHolder(@NotNull PrimeDelegate委托){
超级(代表,R.layout.list\u item\u pdf);
textView=itemView.findViewById(R.id.textView);
}
@凌驾
受保护的void bindDataToView(@NotNull PdfDataHolder dataHolder){
setText(dataHolder.getFilePath());
}
} 
公共类ImageViewHolder扩展了PrimeViewHolder{
私人影像视图;
公共ImageViewHolder(@NotNull PrimeDelegate委托){
超级(代表、右布局、列表、项目、图像);
imageView=itemView.findViewById(R.id.imageView);
}
@凌驾
受保护的void bindDataToView(@NotNull ImageDataHolder dataHolder){
Glide.with(getContext()).load(dataHolder.getFilePath()).into(imageView);
}
} 
适配器:

public class FileListAdapter extends PrimeAdapter {

    @Nullable
    @Override
    public PrimeViewHolder<?> makeViewHolder(@Nullable Class<?> dataHolderClass) {
        if (dataHolderClass == PdfDataHolder.class) {
            return new PdfViewHolder(this);
        } else if (dataHolderClass == ImageDataHolder.class) {
            return new ImageViewHolder(this);
        } else {
            return null;
        }
    }

}
公共类FileListAdapter扩展了PrimeAdapter{
@可空
@凌驾
公共PrimeViewHolder makeViewHolder(@Nullable类dataHolderClass){
if(dataHolderClass==PdfDataHolder.class){
返回新的PDFviewolder(此);
}else if(dataHolderClass==ImageDataHolder.class){
返回新的ImageViewHolder(此);
}否则{
返回null;
}
}
}

首先,您必须清楚如何区分不同的文件。i、 e.来自文件名或其他字段

现在,您可以使用以下两种解决方案中的任意一种: 1。在RecyclerView的适配器中使用多种视图类型。
2.如果您必须为不同的文件显示不同的图标,那么只需添加一些检查即可。

首先,您必须清楚如何区分不同的文件。i、 e.来自文件名或其他字段

现在,您可以使用以下两种解决方案中的任意一种: 1。在RecyclerView的适配器中使用多种视图类型。
2.如果必须为不同的文件显示不同的图标,那么只需添加一些检查即可。

假设我想为不同的布局显示不同的图标。显然,文件名也会有所不同。现在如何进行检查?在onBindViewHolder方法中。。。。字符串文件名=yourList.get(position).getName;字符串扩展名=fileName.substring(fileName.lastIndexOf(“.”);如果(extension.equalsIgnoreCase(“pdf”){//show pdf icon}如果(extension.equalsIgnoreCase(“jpg”){//show jpg icon}你能解释一下第一个吗?我想使用多个视图。现在可以了。。我得到了它。谢谢@ArshdeepLets,我想为不同的布局显示不同的图标。显然,文件名也会有所不同。现在如何进行检查?在onBindViewHolder方法中。。。。字符串文件名=yourList.get(position).getName;字符串扩展名=fileName.substring(fileName.lastIndexOf(“.”);如果(extension.equalsIgnoreCase(“pdf”){//show pdf icon}如果(extension.equalsIgnoreCase(“jpg”){//show jpg icon}你能解释一下第一个吗?我想使用多个视图。现在可以了。。我得到了它。谢谢@Arshdeep