在 recyclerView 中添加两个 ViewHolders
Adding two ViewHolders together in a recyclerView
我正在使用一个片段,它是一个画廊,可以向您显示从我的自定义视频画廊编辑的 select 视频的缩略图。
我在图库中使用了一个按钮,它可以帮助您从片段移动到 activity 您 select 一些视频,然后返回到网格视图中填充数据的同一片段。
问题陈述:我遵循了这个 link Using two viewHolder in the same Adapter 并实现了新的东西,在 Addfragment 中我有一个 Imagebutton,当当您点击按钮进入下一个 activity 时,什么也没有显示,当一些视频被 select 编辑时,您再次来到 AddFragment,现在同一个图像按钮改变了它的位置。
对于上面的内容,我使用了两个 viewHolder,但由于对它的使用了解较少,我不知道如何使用它。请指导,以便我实现我愿意实现的目标。
1.AddFragment.java
public class AddFragment extends Fragment {
private ImageButton nextActivity;
private RecyclerView recyclerView;
ArrayList<File> checkedList = new ArrayList<>();
ImageAdapter imageAdapter;
Button button;
private static final int CustomGallerySelectId = 1;//Set Intent Id
public AddFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_add, container, false);
nextActivity = (ImageButton) view.findViewById(R.id.gotoButton);
recyclerView = (RecyclerView) view.findViewById(R.id.grid_add_view);
button = (Button) view.findViewById(R.id.buttonToGallery);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivityForResult(new Intent(getContext(),VideoGalleryActivity.class),CustomGallerySelectId);
}
});
return view;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.e("IT IS WORKING","YES");
switch(requestCode){
case CustomGallerySelectId :
if(resultCode == RESULT_OK){
Log.e("ADAPTER SETTING","DOING");
//getting the passed value from videogallery
ArrayList<String> getValue = data.getExtras().getStringArrayList("sendData");
Log.e("RECEIVED_DATA======",data.getExtras().getSerializable("sendData").toString());
//adding the files to the list
for(String pathName : getValue) {
File filePath = new File(pathName);
checkedList.add(filePath);
}
//setting the adapter
imageAdapter = new ImageAdapter(checkedList);
GridLayoutManager videoGrid = new GridLayoutManager(getContext(),3);
recyclerView.setLayoutManager(videoGrid);
recyclerView.setAdapter(imageAdapter);
recyclerView.setVisibility(View.VISIBLE);
}
}
}
//making adapter for RecyclerView which loads the desired files
class ImageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private Bitmap bitmap;
private ArrayList<File> fileName;
public ImageAdapter(ArrayList<File> checkedList) {
fileName = checkedList;
}
class ViewHolderGalleryImage extends RecyclerView.ViewHolder {
public ImageView imageView;
public ViewHolderGalleryImage(View itemView) {
super(itemView);
imageView = (ImageView) itemView.findViewById(R.id.galleryImageView);
}
}
class ViewHolderImageButton extends RecyclerView.ViewHolder{
public ImageButton imageButton;
public ViewHolderImageButton(View itemView) {
super(itemView);
imageButton = (ImageButton) itemView.findViewById(R.id.gotoGalleryButton);
}
}
@Override
public int getItemViewType(int position) {
if(fileName !=null){
}
return super.getItemViewType(position);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch(viewType){
case 0 : View galleryView = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_added_video,
parent,false);
galleryView.setLayoutParams(new AbsListView.LayoutParams(215,215));
return new ViewHolderGalleryImage(galleryView);
case 1 : View imageButtonView = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_button_layout,
parent,false);
imageButtonView.setLayoutParams(new AbsListView.LayoutParams(215,215));
return new ViewHolderImageButton(imageButtonView);
}
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
switch (holder.getItemViewType()){
case 0: if(fileName != null){
bitmap = ThumbnailUtils.createVideoThumbnail(fileName.get(position).toString(),1);
}
}
}
@Override
public int getItemCount() {
return fileName.size();
}
} }
Layout 1 膨胀以将图像从 VideoGalery 部署到 AddFragment
custom_added_video.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorWhite"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"
android:layout_marginEnd="3dp"
android:layout_marginStart="3dp">
<ImageView
android:id="@+id/galleryImageView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
android:layout_margin="3dp"
android:layout_centerInParent="true"/>
包含图像按钮的布局
custom_button_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorWhite"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"
android:layout_marginEnd="3dp"
android:layout_marginStart="3dp">
<ImageButton
android:id="@+id/gotoGalleryButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/edittext_border"
android:layout_margin="3dp"
android:src="@mipmap/ic_add_black_24dp"
android:layout_centerInParent="true"/>
我很困惑是否要在 getItemViewType() 中执行哪些操作才能获得结果。
在 getItemViewType()
中,您必须使用位置和 return 不同的整数值来检查您的数据。一种布局的一个 int 值。看起来您分别对 galleryView
和 imageButtonView
使用 0 和 1。您有 ArrayList<File>
作为 RecyclerView
项。该列表应该有必要的数据来决定是使用画廊视图还是图像按钮视图。
像这样:
public int getItemViewType(int position) {
if (fileName.size() == posiiton) {
return 1;
} else {
return 0;
}
}
您将在 onCreateViewHolder
回调中收到 viewType
int 值,您可以使用它来膨胀不同的布局。
我正在使用一个片段,它是一个画廊,可以向您显示从我的自定义视频画廊编辑的 select 视频的缩略图。 我在图库中使用了一个按钮,它可以帮助您从片段移动到 activity 您 select 一些视频,然后返回到网格视图中填充数据的同一片段。
问题陈述:我遵循了这个 link Using two viewHolder in the same Adapter 并实现了新的东西,在 Addfragment 中我有一个 Imagebutton,当当您点击按钮进入下一个 activity 时,什么也没有显示,当一些视频被 select 编辑时,您再次来到 AddFragment,现在同一个图像按钮改变了它的位置。
对于上面的内容,我使用了两个 viewHolder,但由于对它的使用了解较少,我不知道如何使用它。请指导,以便我实现我愿意实现的目标。
1.AddFragment.java
public class AddFragment extends Fragment {
private ImageButton nextActivity;
private RecyclerView recyclerView;
ArrayList<File> checkedList = new ArrayList<>();
ImageAdapter imageAdapter;
Button button;
private static final int CustomGallerySelectId = 1;//Set Intent Id
public AddFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_add, container, false);
nextActivity = (ImageButton) view.findViewById(R.id.gotoButton);
recyclerView = (RecyclerView) view.findViewById(R.id.grid_add_view);
button = (Button) view.findViewById(R.id.buttonToGallery);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivityForResult(new Intent(getContext(),VideoGalleryActivity.class),CustomGallerySelectId);
}
});
return view;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.e("IT IS WORKING","YES");
switch(requestCode){
case CustomGallerySelectId :
if(resultCode == RESULT_OK){
Log.e("ADAPTER SETTING","DOING");
//getting the passed value from videogallery
ArrayList<String> getValue = data.getExtras().getStringArrayList("sendData");
Log.e("RECEIVED_DATA======",data.getExtras().getSerializable("sendData").toString());
//adding the files to the list
for(String pathName : getValue) {
File filePath = new File(pathName);
checkedList.add(filePath);
}
//setting the adapter
imageAdapter = new ImageAdapter(checkedList);
GridLayoutManager videoGrid = new GridLayoutManager(getContext(),3);
recyclerView.setLayoutManager(videoGrid);
recyclerView.setAdapter(imageAdapter);
recyclerView.setVisibility(View.VISIBLE);
}
}
}
//making adapter for RecyclerView which loads the desired files
class ImageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private Bitmap bitmap;
private ArrayList<File> fileName;
public ImageAdapter(ArrayList<File> checkedList) {
fileName = checkedList;
}
class ViewHolderGalleryImage extends RecyclerView.ViewHolder {
public ImageView imageView;
public ViewHolderGalleryImage(View itemView) {
super(itemView);
imageView = (ImageView) itemView.findViewById(R.id.galleryImageView);
}
}
class ViewHolderImageButton extends RecyclerView.ViewHolder{
public ImageButton imageButton;
public ViewHolderImageButton(View itemView) {
super(itemView);
imageButton = (ImageButton) itemView.findViewById(R.id.gotoGalleryButton);
}
}
@Override
public int getItemViewType(int position) {
if(fileName !=null){
}
return super.getItemViewType(position);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch(viewType){
case 0 : View galleryView = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_added_video,
parent,false);
galleryView.setLayoutParams(new AbsListView.LayoutParams(215,215));
return new ViewHolderGalleryImage(galleryView);
case 1 : View imageButtonView = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_button_layout,
parent,false);
imageButtonView.setLayoutParams(new AbsListView.LayoutParams(215,215));
return new ViewHolderImageButton(imageButtonView);
}
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
switch (holder.getItemViewType()){
case 0: if(fileName != null){
bitmap = ThumbnailUtils.createVideoThumbnail(fileName.get(position).toString(),1);
}
}
}
@Override
public int getItemCount() {
return fileName.size();
}
} }
Layout 1 膨胀以将图像从 VideoGalery 部署到 AddFragment custom_added_video.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorWhite"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"
android:layout_marginEnd="3dp"
android:layout_marginStart="3dp">
<ImageView
android:id="@+id/galleryImageView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
android:layout_margin="3dp"
android:layout_centerInParent="true"/>
包含图像按钮的布局 custom_button_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorWhite"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"
android:layout_marginEnd="3dp"
android:layout_marginStart="3dp">
<ImageButton
android:id="@+id/gotoGalleryButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/edittext_border"
android:layout_margin="3dp"
android:src="@mipmap/ic_add_black_24dp"
android:layout_centerInParent="true"/>
我很困惑是否要在 getItemViewType() 中执行哪些操作才能获得结果。
在 getItemViewType()
中,您必须使用位置和 return 不同的整数值来检查您的数据。一种布局的一个 int 值。看起来您分别对 galleryView
和 imageButtonView
使用 0 和 1。您有 ArrayList<File>
作为 RecyclerView
项。该列表应该有必要的数据来决定是使用画廊视图还是图像按钮视图。
像这样:
public int getItemViewType(int position) {
if (fileName.size() == posiiton) {
return 1;
} else {
return 0;
}
}
您将在 onCreateViewHolder
回调中收到 viewType
int 值,您可以使用它来膨胀不同的布局。