Xamarin Visual Studio 2017 Gridview с изображениями и текстовым обзором - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь заполнить gridview изображениями и текстом.Сначала я получил код для работы только с изображениями (12 изображений).Этот код адаптера изображения:

class ImageAdapter : BaseAdapter
{
    public DataSet participants;
    public User MyUser;
    private readonly Context context;


public ImageAdapter(Context c)
    {
        context = c;
    }

    public override int Count
    {
        get { return participants.Tables[0].Rows.Count; }
    }

    public override Java.Lang.Object GetItem(int position)
    {
        return  null;
    }

    public override long GetItemId(int position)
    {
        return 0;
    }
    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        ImageView imageView;

        if (convertView == null)
        {
            // if it's not recycled, initialize some attributes
            imageView = new ImageView(context);
            imageView.LayoutParameters = new AbsListView.LayoutParams(340, 340);
            imageView.SetScaleType(ImageView.ScaleType.CenterCrop);
            imageView.SetPadding(8, 8, 8, 8);
        }
        else
        {
            imageView = (ImageView)convertView;
        }
        string participantid = participants.Tables[0].Rows[position][0].ToString();
        myservice.aservice myService = new service;
        DataSet MyPhotoDataSet = myService.GetPhoto(MyUser.Username, MyUser.Password, participantid );
        byte[] imageBytes = (byte[])MyPhotoDataSet.Tables[0].Rows[0][0];
        Bitmap bitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
        imageView.SetImageBitmap(bitmap);
        // imageView.SetImageResource(thumbIds[position]);
        return imageView;
    }
}

Это работает без проблем.Я получаю все изображения, отображаемые в виде сетки.Мне нужно было добавить текстовое представление для каждого изображения в ячейке и использовать код по следующей ссылке в качестве руководства: Xamarin: создать пользовательскую сетку. Просмотр

Я изменил GetView на это:

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

        if (convertView == null)
        {
            // if it's not recycled, initialize some attributes

            view = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.Cellview, parent, false);

        }
        else
        {
            view = convertView;
        }

        var myimageView = view.FindViewById<ImageView>(Resource.Id.my_image_vieww);
        var textview = view.FindViewById<TextView>(Resource.Id.my_text_view);

        myimageView.LayoutParameters = new AbsListView.LayoutParams(340, 340);
        myimageView.SetScaleType(ImageView.ScaleType.CenterCrop);
        myimageView.SetPadding(8, 8, 8, 8);


        string participantid = participants.Tables[0].Rows[position][0].ToString();
        myservice.aservice myService = new service;
        DataSet MyPhotoDataSet = myService.GetPhoto(MyUser.Username, MyUser.Password, participantid );
        byte[] imageBytes = (byte[])MyPhotoDataSet.Tables[0].Rows[0][0];
        Bitmap bitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
        myimageView.SetImageBitmap(bitmap);
        textview.Text = participants.Tables[0].Rows[position][1].ToString();
        // imageView.SetImageResource(thumbIds[position]);
        return myimageView;
    }
}

Это Cellview.xml:

?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="250dp"
        android:scaleType="centerCrop"
        android:id="@+id/my_image_vieww" />
    <TextView
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/my_text_view" />
</LinearLayout>

Первый раз без проблем, при втором выполнении convertview не равно нулю, а строка view = convertViewвыполнено, что совпадает с «версией просто изображений».В этот момент строка textview = view.FindViewById<TextView>(Resource.Id.my_text_view) возвращает ноль, и я не могу понять, почему.Чего мне не хватает?

1 Ответ

0 голосов
/ 16 февраля 2019

Хорошо ... после некоторого исследования (http://www.mkyong.com/android/android-gridview-example/) и предложений от многих людей, я собрал кое-что, что работает очень хорошо. Я изменил метод GetView на:

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        LayoutInflater inflater = (LayoutInflater)context.GetSystemService(Context.LayoutInflaterService);
        View gridView;
        gridView = new View(context);
        gridView = inflater.Inflate(Resource.Layout.Cellview, null);

        TextView textView = (TextView)gridView.FindViewById(Resource.Id.my_text_view);
        textView.Text = participants.Tables[0].Rows[position][1].ToString();

        ImageView imageView = (ImageView)gridView.FindViewById(Resource.Id.my_image_view);
        byte[] imageBytes = (byte[])participants.Tables[0].Rows[position][2];
        Bitmap bitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
        imageView.SetImageBitmap(bitmap);

        return gridView;
    }

Я также немного изменил Cellview.xml:

<LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools" 
     android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
  <ImageView
      android:layout_width="match_parent"
      android:layout_height="250dp"
      android:scaleType="centerCrop"
      android:id="@+id/my_image_view" />

   <TextView
      android:textAppearance="?android:attr/textAppearanceSmall"    
      android:layout_width="wrap_content"
      android:layout_height="match_parent"
      android:paddingTop="20px"
      android:id="@+id/my_text_view" />

</LinearLayout>

Получил хороший отзывчивый дисплей. Спасибо всем, кто помог.

...