图像适配器Xamarin Android

沙巴兹

首先,请注意以下几点:我正在将图库作为我的应用程序的一部分,因为我发现无法在android中导入多张图片。为此,下面的代码访问相机目录,然后通过和适配器将图像放入GridView中,但是适配器将图像显示在列表中,而不是网格中,这是一个更大的问题,因为应用程序加载后大约一秒钟不会崩溃,但它确实显示Xamarin水印(此构建仅可使用24小时消息)。

我需要您帮助的问题是,为什么我的应用程序无法在手机中运行,以及它如何在模拟器中运行,其次为什么它会显示在列表中而不是网格中?

我已选择写入外部存储并读取外部存储权限。

如果有人能帮助我,我将不胜感激。

我的主要档案

public class MainActivity : Activity
{
    List<string> URIs=new List<string> ();// un parsed URIs

    List<ImageView> IMGs;

    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);
        SetContentView(Resource.Layout.Main);

        IMGs = new List<ImageView> ();
        GetImageFileNames ();
        MakeImageViews ();

        Toast.MakeText (this,"this is sparta",ToastLength.Short).Show ();

        GridView gridView = FindViewById<GridView> (Resource.Id.gridView1);

        PicAdapter PA=  new PicAdapter (this,IMGs);

        gridView.Adapter = PA; 

        }

    void MakeImageViews ()
    {   
        foreach (string uri in URIs) 
        {
            Android.Net.Uri _uri = Android.Net.Uri.Parse(uri);
            ImageView imageView = new ImageView(this);
            imageView.LayoutParameters = new GridView.LayoutParams (85, 85);
            imageView.SetScaleType (ImageView.ScaleType.CenterCrop);
            imageView.SetPadding (8, 8, 8, 8);
            imageView.SetImageURI (_uri);
            IMGs.Add (imageView);

        }
    }

    #region GetFileNames

    void  GetImageFileNames ()
    {
        //ImageView imageView = FindViewById<ImageView> (Resource.Id.imageView1);
        DirectoryInfo dir = new DirectoryInfo (Android.OS.Environment.GetExternalStoragePublicDirectory (Android.OS.Environment.DirectoryDcim).AbsolutePath + "/Camera");
        if (dir.Exists == true) {
            FileInfo[] file = dir.GetFiles ();
            foreach (FileInfo file2 in file) {
                if (file2.Extension == ".jpg" || file2.Extension == ".jpeg" || file2.Extension == ".gif" ||
                    file2.Extension == ".png") {

                    URIs.Add (file2.ToString ());
                }
            }
    //      ImageView ImageView = FindViewById<ImageView> (Resource.Id.imageView1);
    //      ImageView.SetImageURI (URIs [1]);
            //  
        } else {
            Toast.MakeText (this, "Can not read files from camera folder or no files in camera folder", ToastLength.Short).Show ();
        }

    }

    #endregion
}

适配器

public class PicAdapter: BaseAdapter<ImageView>
{   Context context;
    List<ImageView> IMGs;
    public PicAdapter (Context c,List<ImageView> imgs)
    {
        this.context = c;
        this.IMGs = imgs;

    }


    #region implemented abstract members of BaseAdapter
    public override long GetItemId (int position)
    {
        return position;
    }
    public override Android.Views.View GetView (int position, Android.Views.View convertView, Android.Views.ViewGroup parent)
    {
        View tile = convertView;

        if (tile == null)
        {
            tile = LayoutInflater.From(context).Inflate(Resource.Layout.SinglePicTile,null,false);

        }
        ImageView picture = tile.FindViewById<ImageView>(Resource.Id.PicTile); // here you are making each grid view tiles
        picture = IMGs [position];
        return picture;
    }

    public override int Count {
        get {return IMGs.Count;}
    }
    #endregion

    #region implemented abstract members of BaseAdapter
    public override ImageView this [int index] {
        get {
            return IMGs [index];
        }
    }
    #endregion
}

Xaml Main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/gridView">
    <GridView
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/gridView1" />
</LinearLayout>

适配器模板:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:minWidth="25px"
    android:minHeight="25px">
    <ImageView
        android:src="@android:drawable/ic_menu_gallery"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:id="@+id/PicTile"
        android:padding="10dp"
        android:maxWidth="100dp"
        android:maxHeight="100dp"
        android:cropToPadding="true" />
</LinearLayout>
芝士男爵

而不是创建ImageView实例并将其移交给您的Adapter相反,您应该只将其交给字符串列表,然后让它处理初始化。否则,您将很快耗尽内存。

因此,将您更改Adapter为:

public class PicAdapter : BaseAdapter<string>
{
    private List<string> _imageUrls = new List<string>();

    public void AddImage(string uri)
    {
        _imageUrls.Add(uri);
    }

    ...
}

然后,GetView您将实例化视图,或重用上一个单元格中的一个并设置URI,该URI包含在您传递的字符串之一中Adapter

您的问题基本上在于此行:

picture = IMGs [position];

这段代码并没有神奇地将ImageView布局添加到布局中,您需要操纵ImageView您从布局中获取的内容FindViewById

public override View GetView (int position, View convertView, ViewGroup parent)
{
    var view = convertView;

    if (view == null)
        view = LayoutInflater.From(context).Inflate(Resource.Layout.SinglePicTile, parent, false);

    var picture = tile.FindViewById<ImageView>(Resource.Id.PicTile);
    picture.SetImageURI(Android.Net.Uri.Parse(_imageUrls[position]));
    return picture;
}

因此,基本上删除该MakeImageViews()方法,因为这是Adapter应该处理的事情

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

适配器不输出图像(Android)

来自分类Dev

用于GridView的Android文本和图像适配器的片段

来自分类Dev

适配器无法在Android上从JSON加载图像

来自分类Dev

Android,图像适配器,getCount()中的空指针异常

来自分类Dev

Android ListView适配器异步任务图像加载

来自分类Dev

Android基础适配器

来自分类Dev

如何在Xamarin.Android中将DataTable转换为ListView适配器

来自分类Dev

使蓝牙适配器与Xamarin for Android API 19或更高版本一起使用

来自分类Dev

如何在Xamarin android Array适配器中获取可见列表项计数

来自分类Dev

Android RecyclerView适配器项目刷新

来自分类Dev

Android清除arraylist或适配器?

来自分类Dev

带适配器Android的isEnabled()

来自分类Dev

Android适配器布局错误

来自分类Dev

适配器重新加载Android

来自分类Dev

Android上的GridView适配器(错误)

来自分类Dev

带适配器Android的isEnabled()

来自分类Dev

Android ListView适配器未过滤

来自分类Dev

Android适配器布局错误

来自分类Dev

Android ListView适配器...不重绘

来自分类Dev

从适配器android返回更改的arrayList

来自分类Dev

适配器重新加载Android

来自分类Dev

Android适配器上下文

来自分类Dev

Android查询的适配器重置

来自分类Dev

Android,适配器的getView中的NullPointerException

来自分类Dev

Android 适配器父宽度 = 0

来自分类Dev

RecyclerView 适配器 Android Studio

来自分类Dev

Android Volley-加载图像时在列表视图适配器中显示进度栏

来自分类Dev

Android:具有图像和文本错误的自定义网格视图适配器

来自分类Dev

阵列适配器从Res文件夹加载图像(Android App)