简体   繁体   English

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

[英]How to create heterogeneous layouts inside RecyclerView?

I want users to select images, pdf, any other documents in any order and put them in the recyclerView. 我希望用户以任何顺序选择图像,pdf,任何其他文档,并将它们放入recyclerView。 I have different layouts for each of them. 我每个人都有不同的布局。

So far I am getting the Uri and the filename from the selected image or pdf and putting them into list. 到目前为止,我从选定的图像或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();
            }
        } 

And I have a adapter class which now only contains one layout: 我有一个适配器类,现在只包含一个布局:

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

This is getFilename() method: 这是getFilename()方法:

public String getFilename(Uri uri){
        String result =null;
        if (uri.getScheme().equals("content")){
            Cursor cursor = getContentResolver().query(uri,null,null,null,null);
            try{
                if (cursor!=null&&cursor.moveToFirst()){
                    result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
                }
            }finally {
                cursor.close();
            }
        }
        if (result == null){
            result = uri.getPath();
            int cut = result.lastIndexOf("/");
            if (cut!=-1){
                result = result.substring(cut+1);
            }
        }
        return result;
    }

How to make two different layouts depending on the type of document it has ie, image or a pdf? 如何根据其具有的文档类型(即图像或pdf)进行两种不同的布局?

You should have multiple view types. 您应该具有多种视图类型。 I suggest you to use PrimeAdapter to do this easier. 我建议您使用PrimeAdapter简化此操作。 Please see its examples, however you can write your classes like following: 请查看其示例,但是您可以像下面这样编写类:

DataHolders: DataHolders:

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

ViewHolders: ViewHolders:

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

} 

Adapter: 适配器:

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

}

First of all, you must be clear that how would you differentiate for different files. 首先,您必须清楚如何区分不同的文件。 ie from FileName or someother field. 即从FileName或其他字段。

Now you can use any of these two solutions : 1. Use multiple view types inside RecyclerView's Adapter. 现在,您可以使用以下两种解决方案中的任何一种: 1.在RecyclerView的Adapter中使用多种视图类型。 2. If you have to just show different icons for different files , then you can do that just by adding some checks. 2.如果您只需要为不同的文件显示不同的图标 ,则只需添加一些检查即可。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM