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

时间:2018-09-23 06:28:05

标签: java android android-recyclerview recycler-adapter

我希望用户以任何顺序选择图像,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()方法:

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

如何根据其具有的文档类型(图像或pdf)进行两种不同的布局?

2 个答案:

答案 0 :(得分:1)

您应该具有多种视图类型。建议您使用PrimeAdapter来简化此操作。请查看其示例,但是您可以像下面这样编写类:

DataHolders:

react-native-image-resizer

ViewHolders:

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

} 

答案 1 :(得分:1)

首先,您必须清楚如何区分不同的文件。即来自FileName或其他字段。

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