Android Recycler вид с сеткой карт - PullRequest
0 голосов
/ 23 мая 2018

У меня есть вид рециркулятора с картами, расположенными линейно следующим образом: это мой текущий интерфейс, мне нужна помощь со смешанным видом, как показано на втором изображении

My interface

но мне нужен смешанный вид с сетками, подобными этому: Это мой целевой интерфейс target interface

** Мне нужна помощь в достижении этого: Это то, что я пыталсядо сих пор ** card.axml ****

 <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="8dp">
        <android.support.v7.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="350dp"
            app:cardCornerRadius="10dp"
            android:layout_margin="6dp">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
                <ImageView
                    android:id="@+id/avatar2"
                    android:layout_width="match_parent"
                    android:layout_height="160dp"
                    android:scaleType="centerCrop"
                    android:src="@drawable/cheese_1" />
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:padding="16dp">
                    <TextView
                        android:id="@+id/Text11"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="8dp"
                        android:maxLines="2"
                        android:textColor="#000"
                        android:textSize="18sp" />
                    <TextView
                        android:id="@+id/Text12"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:maxLines="3"
                        android:textColor="#555" />
                </LinearLayout>
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">
                    <Button
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="share"
                        android:theme="@style/PrimaryFlatButton" />
                    <Button
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="explore"
                        android:theme="@style/PrimaryFlatButton" />
                </LinearLayout>
            </LinearLayout>
        </android.support.v7.widget.CardView>
    </RelativeLayout>

Адаптер представления My Recycler

public class SimpleStringRecyclerViewAdapter : RecyclerView.Adapter
        {

            private List<Data> mValues;


            Context context;

            public SimpleStringRecyclerViewAdapter(Context context, List<Data> items)
            {
                this.context = context;
                mValues = items;

            }

            public override int ItemCount
            {

                get
                {
                    return mValues.Count();
                }
            }

            public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
            {
                if (holder is SimpleViewHolder)
                    try
                    {
                        Data item = mValues.ElementAt(position);

                        var simpleHolder = holder as SimpleViewHolder;

                        simpleHolder.mTxtView.Text = Android.Text.Html.FromHtml(item.article.Title).ToString();
                        simpleHolder.mTxtView2.Text = item.article.Description;


                        using (var imageView = simpleHolder.mImageView)
                        {
                            string url = Android.Text.Html.FromHtml(item.article.UrlToImage).ToString();

                            //Download and display image
                            UrlImageViewHelper.SetUrlDrawable(imageView,
                                url, Resource.Drawable.cheese_1
                                );



                        }
                        //    simpleHolder.mprogressbar.Visibility = ViewStates.Gone;
                    }
                    catch (Exception e)
                    {
                        //Toast.MakeText(this.context, e.ToString(), ToastLength.Long).Show();
                    }



            }

            public override int GetItemViewType(int position)
            {

                    return Resource.Layout.ItemsList;



            }



            public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
            {
                if (viewType == Resource.Layout.ItemsList)
                {
                    View view = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.ItemsList, parent, false);
                    view.SetBackgroundColor(Color.White);


                    SimpleViewHolder holder = new SimpleViewHolder(view);
                    // holder.mprogressbar = view.FindViewById<ProgressBar>(Resource.Id.progressBar);
                    // holder.mprogressbar.Visibility = ViewStates.Visible;


                    //Showing loading progressbar

                    return holder;
                }

            }
        }

        public class SimpleViewHolder : RecyclerView.ViewHolder
        {
            public string mBoundString;
            public readonly View mView;
            public readonly ImageView mImageView;
            public readonly TextView mTxtView;
            public readonly TextView mTxtView2;
            //   public ProgressBar mprogressbar;


            public SimpleViewHolder(View view) : base(view)
            {
                mView = view;
                mImageView = view.FindViewById<ImageView>(Resource.Id.avatar2);
                mTxtView = view.FindViewById<TextView>(Resource.Id.Text11);
                mTxtView2 = view.FindViewById<TextView>(Resource.Id.Text12);
                //   mprogressbar = view.FindViewById<ProgressBar>(Resource.Id.progressBar);


            }


        }

setupRecyclerView метод

 private async void SetUpRecyclerView(RecyclerView recyclerView)
            {
      Activity.RunOnUiThread(() =>
            {

 dataUse = OfflineDeserializer.OfflineData(content, json2);

                recyclerView.SetLayoutManager(new LinearLayoutManager(recyclerView.Context));
                recyclerView.SetAdapter(new SimpleStringRecyclerViewAdapter(recyclerView.Context, dataUse));
                if (vp.IsShown)
                {
                    vp.Visibility = ViewStates.Invisible;

                }
    }

1 Ответ

0 голосов
/ 28 мая 2018

В вашем методе SetUpRecyclerView используйте GridLayoutManager вместо LinearLayoutManager с счетчиком промежутков 2, а затем вызовите SetSpanSizeLookup в менеджере раскладки.С помощью пользовательского поиска размера диапазона вы можете определить, какие элементы будут охватывать весь макет.

Быстрый пример:

SimpleStringRecyclerViewAdapter myAdapter = new SimpleStringRecyclerViewAdapter(recyclerView.Context, dataUse)
GridLayoutManager layoutManager = new GridLayoutManager(recyclerView.Context, 2);
layoutManager.SetSpanSizeLookup(new SpanSizeLookup(myAdapter));
recyclerView.SetLayoutManager(layoutManager);
recyclerView.SetAdapter(myAdapter);

И класс SpanSizeLookup:

internal class SpanSizeLookup : GridLayoutManager.SpanSizeLookup
{
    private SimpleStringRecyclerViewAdapter _adapter;
    public SpanSizeLookup(SimpleStringRecyclerViewAdapter adapter) => _adapter = adapter;
    public override int GetSpanSize(int position)
    {
        return _adapter.GetItemViewType(position);
    }
}

В вашем SimpleStringRecyclerViewAdapter классе переопределите GetItemViewType таким образом, который соответствует тому, как вы решаете, какие элементы охватывают всю ширину;Здесь я использую IsHeader bool, но вы можете использовать все, что пожелаете:

public override int GetItemViewType(int position)
{
    if(mValues[position].IsHeader)
         return 1;
    else
         return 2;
}

Вы также можете настроить его, вернув перечисление с GetItemViewType и определив количество промежутков в SpanSizeLookup.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...