【问题标题】:Making RecyclerView image fullscreen when clicked单击时使 RecyclerView 图像全屏
【发布时间】:2017-11-23 03:41:55
【问题描述】:

我想在点击时制作一个 recyclerview 图像全屏并在下面显示一个按钮,如此 xml 文件所示

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" >

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Select"
    android:id="@+id/profileButton"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true" />

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/fullscreenView"
    android:layout_above="@+id/profileButton"
    />

</RelativeLayout>

这是我目前使用的图像适配器

public class ImageAdapter extends 
RecyclerView.Adapter<ImageAdapter.ViewHolder>
{
private File imagesFile;


public ImageAdapter(File folderFile)
{
    imagesFile = folderFile;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.gallery_images_relative_layout,parent,false);
    return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position)
{
    File imageFile = imagesFile.listFiles()[position];
    Bitmap imageBitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath());
    holder.getImageView().setImageBitmap(imageBitmap);


}
@Override
public int getItemCount()
{
    if(MainActivity.checkIfGalleryEmpty(imagesFile)==true)
        return 0;
    else
        return imagesFile.listFiles().length;
}

public static class ViewHolder extends RecyclerView.ViewHolder
{
    private ImageView imageView;

    public ViewHolder(View view)
    {
        super(view);
        imageView = (ImageView) view.findViewById(R.id.imageGalleryView);

    }
    public ImageView getImageView()
    {
        return imageView;
    }
}
}

我不确定将onClickListener 方法放在哪里(应该放在这里还是在我的主要位置?)或者如何实现显示更大图像的onClickListener。此外,显示的按钮必须执行一个功能,因此它也将有一个onClicklistener,可能在另一个活动文件中。如果您考虑到我拥有的框架,对如何实现这一点有任何提示或建议,请告诉我。如果有帮助的话,我也愿意发布我的 MainActivity 文件的部分内容。

【问题讨论】:

标签: java android android-recyclerview onclicklistener


【解决方案1】:

像这样在viewholder中注册onclick:

public static class ViewHolder extends RecyclerView.ViewHolder
{
private ImageView imageView;

public ViewHolder(View view)
{
    super(view);

        ImageView imageView = (ImageView) view.findViewById(R.id.imageGalleryView);
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {
                //TODO: Zooming a View
            }
        });

}
public ImageView getImageView()
{
    return imageView;
}
}

使用缩放视图显示全尺寸图像。

Developer site for display fullsize image

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    在 ImageAdapter 类中创建接口

    public interface Callback {
        void onImageClicked(string imagePath);
    }
    

    然后添加构造函数

    Callback mCallback;
    public ImageAdapter(File folderFile, Callback callback)
    {
        imagesFile = folderFile;
        mCallback = callback;
    }
    

    然后在调用 ImageAdapter 的 Activity/Fragment 中,传递回调并实现回调方法,设置适配器将与您使用的相同

    ImageAdapter adapter = ImageAdapter(folderFile, this);
    

    实现回调方法后,会在activity/fragment中找到一个方法

    @Override
    public void onImageClicked(string imagePath) {
         //Here you can do anything with the clicked image (Show the full screen image)
    }
    

    然后从适配器你可以通过回调将 imagePath 传递给活动

    holder.getImageView().setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mCallback!=null){
                        mCallback.onImageClicked(imageFile.getAbsolutePath());
                    }
                }
            });
    

    据我了解,您的问题是如何调用 onClick 方法。如果您对如何显示全屏图像有疑问,可以使用全屏图像视图创建另一个活动并设置图像。

    【讨论】:

    • 嗨,这段代码看起来不错,我正在尝试实现它,但是当我把 ImageAdapter 适配器 = ImageAdapter(folderFile, this);在我的活动中,我收到一个回调字段错误,显示 [packagename].ImageAdapter.Callback 无法应用于 [packagename].MainActivity。我误解了你在这里写的内容吗?
    • 将光标放在该行上点击alt+enter,然后实现方法
    • 它给了我一些选择,但我像这个 ImageAdapter adapter = new ImageAdapter(GalleryFolder, (ImageAdapter.Callback) this);这是你想要的吗?
    • 不,兄弟,好吧,你做一件事.. 在第一行实现回调 public class MainActivity extends AppCompatActivity implements ImageAdapter.Callback
    【解决方案3】:

    您可以在recyclerview viewholder中启用单击图像视图,onclick将文件路径传递给下一个活动,您可以使用ImageView来设置此图像位图

    public static class ViewHolder extends RecyclerView.ViewHolder
     {
    private ImageView imageView;
    
    public ViewHolder(View view)
    {
        super(view);
    
            ImageView imageView = (ImageView) view.findViewById(R.id.imageGalleryView);
            imageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v)
                {
    
                    File imageFile = imagesFile.listFiles()[getAdapterPosition()];
    
                    Intent intent = new Intent(context,FullScreenActivity.class);
                    intent.putExtra("filepath",imageFile.getAbsolutePath());
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(intent);    
    
                }
            });
    
    }
    public ImageView getImageView()
    {
        return imageView;
    }
    }
    

    同样在适配器类中,将context 传递给构造函数

    public ImageAdapter(File folderFile,Context context)
    {
    imagesFile = folderFile;
    mContext = context;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-14
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多