Вложенный Listview в Xamarin.Android — попытка с Listview внутри Listview

#xamarin.android

#xamarin.android

Вопрос:

Я пытаюсь показать ListView внутри ListView

Это делается для создания вложенного ListView в Xamarin.Android (не Xamarin.Форма), но во втором ListView отображается только один элемент.

Я создал другой макет, чтобы поместить один текст метки и ListView, используя basedapater для заполнения основного LV.

         View listitem = convertView;
        listitem = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.ListViewDesign, parent, false);

        TextView TxtNo = listitem.FindViewById<TextView>(Resource.Id.TxtNo);
        LinearLayout layout = listitem.FindViewById<LinearLayout>(Resource.Id.linearLayout1);
        layout.Visibility = ViewStates.Visible;


        ListView ListLibros = listitem.FindViewById<ListView>(Resource.Id.ListLibros);
        List<string> lista = new List<string>();
        TxtNo.Text = mItem[position].AUTOR;

        for (var i = 0; i < mItem[position].LIBROS.Count(); i  ) {

            lista.Add(mItem[position].LIBROS[i].Descripcion);

        }



        ListLibros.Adapter = new ArrayAdapter<string>(ListLibros.Context, Android.Resource.Layout.SimpleListItem1, lista);

        return listitem;
 

Ответ №1:

есть два способа достичь этого.

1.настройте ListView, переопределите OnMeaSure метод следующим образом:

 class MyListView :ListView
{
    protected MyListView(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
    {
    }

    public MyListView(Context context) : base(context)
    {
    }

    public MyListView(Context context, IAttributeSet attrs) : base(context, attrs)
    {
    }

    public MyListView(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr)
    {
    }

    public MyListView(Context context, IAttributeSet attrs, int defStyleAttr, int defStyleRes) : base(context, attrs, defStyleAttr, defStyleRes)
    {
    }

    protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        int expandSpec = MeasureSpec.MakeMeasureSpec(Integer.MaxValue >> 2,
            MeasureSpecMode.AtMost);
        base.OnMeasure(widthMeasureSpec, expandSpec);
    }
}
 

затем используйте MyListView в качестве внутреннего ListView.

2. не используйте ListView inner, используйте LinearLayout, заполненный представлениями, например:

 LinearLayout list = (LinearLayout) listitem.findViewById(R.id.list_layout);
list.removeAllViews();
for (var i = 0; i < mItem[position].LIBROS.Count(); i  ) {
        TextView textView = new TextView(context); // you could custon View here
        textView.Text = mItem[position].LIBROS[i].Descripcion;
        lista.Add(textView );

    }