Xamarin,Android:这个“ListView适配器”如何工作?

时间:2017-06-11 16:40:49

标签: android listview xamarin

所以,我正在开发这个包含聊天功能的应用。我下载了一个示例,我正在尝试更改布局。但这种方式不起作用。有另一种布局称为listview适配器,我不知道它做了什么,但我认为它以某种方式与问题相关联。这是原始的LayOut(只有一个列表,一个按钮和一个edittext:

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:padding="16dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <com.refractored.fab.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:src="@drawable/ic_send"
    android:id="@+id/fab"
    android:tint="@android:color/white"
    android:layout_alignParentBottom="true"
    android:layout_alignParentEnd="true"

    />

  <EditText
    android:layout_toLeftOf="@+id/fab"
    android:layout_alignParentBottom="true"
    android:layout_alignParentStart="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="Your message"
    android:id="@+id/input"
    />

  <ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"
    android:layout_above="@+id/fab"
    android:divider="@android:color/transparent"
    android:dividerHeight="16dp"
    android:id="@+id/list_of_messages"
    android:layout_marginBottom="16dp"
    />

</RelativeLayout>

这是ListView适配器:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent">


  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"
    android:id="@+id/message_user"
    android:textStyle="normal|bold"
    />


  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/message_user"
    android:layout_alignParentEnd="true"
    android:id="@+id/message_time"

    />


  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/message_user"
    android:layout_alignParentStart="true"
    android:layout_marginTop="5dp"
    android:id="@+id/message_text"
    android:textAppearance="@style/TextAppearance.AppCompat.Body1"
    android:textSize="18sp"
    />


</RelativeLayout>

这是LIstView的代码:

using System;
using System.Collections.Generic;
using Android.Views;
using Android.Widget;
using Java.Lang;
using Android.Content;

namespace XamarinChatApp
{
    internal class ListViewAdapter : BaseAdapter
    {
        private List<MessageContent> lstMessage;
        private MainActivity mainActivity;

        public ListViewAdapter(MainActivity mainActivity, List<MessageContent> lstMessage)
        {
            this.mainActivity = mainActivity;
            this.lstMessage = lstMessage;
        }

        public override int Count
        {
            get
            {
                return lstMessage.Count;
            }
        }

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

        public override long GetItemId(int position)
        {
            return position;
        }

        public override View GetView(int position, View convertView, ViewGroup parent)
        {
            LayoutInflater inflater = (LayoutInflater)mainActivity.BaseContext.GetSystemService(Context.LayoutInflaterService);
            View itemView = inflater.Inflate(Resource.Layout.List_Item, null);

            TextView message_user, message_time, message_content;
            message_user = itemView.FindViewById<TextView>(Resource.Id.message_user);
            message_content = itemView.FindViewById<TextView>(Resource.Id.message_text);
            message_time = itemView.FindViewById<TextView>(Resource.Id.message_time);

            message_user.Text = lstMessage[position].Email;
            message_time.Text = lstMessage[position].Time;
            message_content.Text = lstMessage[position].Message;

            return itemView;
        }
    }
}

为什么我不能改变第一个LayOut?这个ListView适配器做了什么execalty?那些相关吗?对我来说,它看起来只是格式化列表的内部。但我没有看到这种联系......

谢谢:)

1 个答案:

答案 0 :(得分:0)

第一个布局给出了页面的整体布局。

第二种布局给出了每个项目的布局,即每条消息(用户名,消息,时间)。

现在您将所有数据传递给listview适配器,这将逐个显示每条消息。 listview适配器只会逐个膨胀第二个布局。

listview的代码是adpater的标准代码,它返回计数,位置,项目和膨胀的视图。