Java 如何在单击时将图像或路径从Recyclerview传递到下一个活动,以便显示图像完整视图?

Java 如何在单击时将图像或路径从Recyclerview传递到下一个活动,以便显示图像完整视图?,java,android,android-recyclerview,Java,Android,Android Recyclerview,我真的不知道怎么做。我尝试了一些教程,但没有为我工作。。。我已经用很多方法做过了,但是做不到 这是我的回收袋 public class RecyclerViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener{ public TextView countryName; public ImageView countryPhoto; String s; Bitmap image; public Recy

我真的不知道怎么做。我尝试了一些教程,但没有为我工作。。。我已经用很多方法做过了,但是做不到

这是我的回收袋

public class RecyclerViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener{

public TextView countryName;
public ImageView countryPhoto;
String s;
Bitmap image;

public RecyclerViewHolders(View itemView) {
    super(itemView);
    itemView.setOnClickListener(this);
    countryPhoto = (ImageView)itemView.findViewById(R.id.country_photo);
}

@Override    public void onClick(View view) {
    Intent imageIntent  = new Intent(view.getContext(),GalleryFullImage.class);
    imageIntent.putExtra("id",getAdapterPosition());
    view.getContext().startActivity(imageIntent);
    Toast.makeText(view.getContext(), "Clicked Country Position = " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
}}
这是我的Recyclerview适配器

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolders> {

private ArrayList<String> arrayList;
private Context context;

public RecyclerViewAdapter(Context context, ArrayList<String> itemList) {
    this.arrayList = itemList;
    this.context = context;
}

@Override
public long getItemId(int position) {
    return position;
}



@Override    public RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int viewType) {
    View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.gallery_item, null);
    RecyclerViewHolders rcv = new RecyclerViewHolders(layoutView);
    return rcv;
}

@Override    public void onBindViewHolder(RecyclerViewHolders holder, int position) {
    Bitmap bitmap = BitmapFactory.decodeFile(arrayList.get(position));
    holder.countryPhoto.setImageBitmap(bitmap);

}

@Override    public int getItemCount() {
    return this.arrayList.size();
}}
公共类RecycleServiceAdapter扩展了RecyclerView.Adapter{
私有ArrayList ArrayList;
私人语境;
公共RecycleServiceAdapter(上下文,ArrayList itemList){
this.arrayList=itemList;
this.context=上下文;
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@重写CreateViewHolder上的公共RecycleServiceWholders(视图组父级,int-viewType){
View layoutView=LayoutInflater.from(parent.getContext()).flate(R.layout.gallery_项,空);
RecyclerViewWholders rcv=新的RecyclerViewWholders(布局视图);
返回rcv;
}
@覆盖BindViewHolder上的公共void(RecyclerViewHolder,int位置){
位图Bitmap=BitmapFactory.decodeFile(arrayList.get(position));
holder.countryPhoto.setImageBitmap(位图);
}
@重写公共int getItemCount(){
返回此.arrayList.size();
}}
这是我的厨房活动

public class GalleryActivity extends AppCompatActivity {
ArrayList<String> stringList;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activty_gallery);
    setTitle("Gallery");

    stringList = new ArrayList<>();
    // Be sure that this file is exist !!

    String targetPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Country";
    File targetDirector = new File(targetPath);
    File[] files = targetDirector.listFiles();
    try
    {
        Arrays.sort( files, new Comparator()
        {
            public int compare(Object o1, Object o2) {

                if (((File)o1).lastModified() > ((File)o2).lastModified()) {
                    return -1;
                } else if (((File)o1).lastModified() < ((File)o2).lastModified()) {
                    return +1;
                } else {
                    return 0;
                }
            }

        });
        for (File file : files) {
        stringList.add(file.getAbsolutePath());
    }
    }catch (Exception e)
    {
        Log.e("Sort Error", e.getMessage());
    }

    RecyclerView rView = (RecyclerView)findViewById(R.id.my_recycler_view);
    RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(),2);
    rView.setHasFixedSize(true);
    rView.setLayoutManager(layoutManager);
    RecyclerViewAdapter rcAdapter = new RecyclerViewAdapter(getApplicationContext(), stringList);
    rView.setAdapter(rcAdapter);


}
公共类GalleryActivity扩展了AppCompatActivity{
ArrayList字符串列表;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.Activity_gallery);
片名(“画廊”);
stringList=新的ArrayList();
//确保此文件存在!!
字符串targetPath=Environment.getExternalStorageDirectory().getAbsolutePath()+“/Country”;
文件targetDirector=新文件(targetPath);
File[]files=targetDirector.listFiles();
尝试
{
Arrays.sort(文件,新的Comparator()
{
公共整数比较(对象o1、对象o2){
如果(((文件)o1.lastModified()>((文件)o2.lastModified()){
返回-1;
}else if(((文件)o1.lastModified()<((文件)o2.lastModified()){
返回+1;
}否则{
返回0;
}
}
});
用于(文件:文件){
添加(file.getAbsolutePath());
}
}捕获(例外e)
{
Log.e(“排序错误”,e.getMessage());
}
RecyclerView rView=(RecyclerView)findViewById(R.id.my\u recycler\u视图);
RecycleView.LayoutManager LayoutManager=新的GridLayoutManager(getApplicationContext(),2);
rView.setHasFixedSize(真);
rView.setLayoutManager(layoutManager);
RecycleServiceAdapter rcAdapter=新的RecycleServiceAdapter(getApplicationContext(),stringList);
rView.setAdapter(rcAdapter);
}

}

由于您是从
onBindViewHolder
中的文件加载位图,因此您可以在
onClick
中传递路径,然后在下一个活动中再次对其进行解码。在您的情况下,这可能需要做一些工作,因为您的
视图持有者
是与您的RecyclerView分开定义的,因此它无法访问您的数据集。首先,移动
ViewHolder
,使其成为
RecyclerView
的静态嵌套类。大概是这样的:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolders>
    private ArrayList<String> arrayList;
    ....

    public static class RecyclerViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener{
    ....

    @Override
    public void onClick(View view) {
        Intent intent  = new Intent(...);
        intent.putExtra("path",arrayList.get(getAdapterPosition());
        /* send intent*/
    }
}
公共类RecycleServiceAdapter扩展了RecyclerView.Adapter
私有ArrayList ArrayList;
....
公共静态类RecyclerViewWholders扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
....
@凌驾
公共void onClick(视图){
意向意向=新意向(…);
intent.putExtra(“path”,arrayList.get(getAdapterPosition());
/*发送意图*/
}
}

您只需在viewholder中应用onClickListener,在integer中获取单击的适配器位置,并在下一个全屏活动中传递它

这是完整的代码,希望对您有所帮助

main活动

public class MainActivity extends AppCompatActivity {

  private final Integer image_ids[] = {
      R.drawable.image1,
      R.drawable.image2,
      R.drawable.image3,
      R.drawable.image4,
      R.drawable.image5,

};

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recyclerview);
    recyclerView.setHasFixedSize(true);

    RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(),gridColumnlayout);
    recyclerView.setLayoutManager(layoutManager);

    ArrayList<CreateList> createLists = prepareData();
    MyAdapter adapter = new MyAdapter(getApplicationContext(), createLists);
    recyclerView.setAdapter(adapter);


}
 private ArrayList<CreateList> prepareData(){

    ArrayList<CreateList> theimage = new ArrayList<>();
    for(int i = 0; i< 5; i++){
        CreateList createList = new CreateList();
        createList.setImage_ID(image_ids[i]);
        theimage.add(createList);
    }
    return theimage;
}

}
public class FullScreen extends AppCompatActivity {


 private final Integer image_ids[] = {
        R.drawable.image1,
        R.drawable.image2,
        R.drawable.image3,
        R.drawable.image4,
        R.drawable.image5,
 };


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_full_screen);


    Intent intent = getIntent();
    String message = intent.getStringExtra(MyAdapter.EXTRA_MESSAGE);
    int position = Integer.parseInt(message);

    ImageView imageView = (ImageView) viewItem.findViewById(R.id.imageView);
    imageView.setImageResource(image_ids[position]);

    } 
}  
MyAdapter

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private ArrayList<CreateList> galleryList;
private Context context;
public final static String EXTRA_MESSAGE = "FullScreen Image";


public MyAdapter(Context context, ArrayList<CreateList> galleryList) {
    this.galleryList = galleryList;
    this.context = context;
}

@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int i) {

    return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.list_item, parent, false));
}

@Override
public void onBindViewHolder(final MyAdapter.ViewHolder viewHolder, int i) {

    CreateList currentList = galleryList.get(i);
    Glide.with(context).load(currentList.getImage_ID()).centerCrop().crossFade().into(viewHolder.img);

    viewHolder.img.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int pos = viewHolder.getAdapterPosition();
            String stringID = Integer.valueOf(pos).toString();

            Intent intent = new Intent(MyAdapter.this.context, FullScreen.class);
            intent.putExtra(EXTRA_MESSAGE, stringID);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        }
    });
}

@Override
public int getItemCount() {
    return galleryList.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {

    private ImageView img;

    public ViewHolder(View view) {
        super(view);
        img = (ImageView) view.findViewById(R.id.image);
    }
}
list_item.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<ImageView
    android:layout_width="match_parent"
    android:layout_height="170dp"
    android:scaleType="fitXY"
    android:id="@+id/image"/>

</RelativeLayout>


您的图像是在drawables文件夹中还是从internet加载?我使用的是存储在设备上的文件夹中的图像我不知道设备图像,但如果图像在drawables文件夹中,我可以给出如何将图像全屏传递到下一个活动的解决方案,希望您可以进行更改然后是否回收服务Wholders.class residRecycleServiceAdapter.class中的es???忘记下一页上显示的图像,是否侦听单击事件?您好,我正在使用我的方法获取图像的位置。如何在FullimageActivity中使用该位置显示全屏图像?
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<ImageView
    android:layout_width="match_parent"
    android:layout_height="170dp"
    android:scaleType="fitXY"
    android:id="@+id/image"/>

</RelativeLayout>