Java 如何在RecyclerView中创建异构布局?
我希望用户以任何顺序选择图像、pdf和任何其他文档,并将它们放入recyclerView。我有他们每个不同的布局 到目前为止,我从选定的图像或pdf中获取Uri和文件名,并将它们放入列表中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
@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