我希望用户以任何顺序选择图像,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)进行两种不同的布局?
答案 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.如果您必须仅针对不同的文件显示不同的图标,则只需添加一些检查即可。