【问题标题】:Using SimpleListItemActivated1 with custom Adapter in Android在 Android 中将 SimpleListItemActivated1 与自定义适配器一起使用
【发布时间】:2014-04-08 18:24:22
【问题描述】:

我在 Xamarin 中为我的 Android 应用程序构建了一个自定义适配器,因为我想自定义 ListviewItems 并且它可以工作。
问题是我希望突出显示选定的 Listitem。所以我想使用SimpleListItemActivated1 标志。但是您可以在这种情况下将此标志与ArrayAdapter 一起使用:

_list.Adapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItemActivated1,
                        tempNames);

但我已经实现了自己的适配器,我需要它来自定义我的列表视图项:

_adapter = new AndroidUI.KundenViewAdapter (this,_kunden);
_list.Adapter = _adapter

如何在我的适配器中使用SimpleListItemActivated1

我的适配器的代码如下:

namespace AndroidUI
{
public class KundenViewAdapter : BaseAdapter<BusinessLayer.Kunde>
{
    private readonly Activity _context;
    private List<Kunde> _kunden;

    public KundenViewAdapter(Activity context, IEnumerable<Kunde> kunden)
    {
        _kunden = kunden.ToList ();
        _context = context;
    }

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

    public override long GetItemId(int position)
    {
        return Convert.ToInt64 ( _kunden[position].ID);
    }

    public override Kunde this[int position]
    {
        get { return _kunden[position]; }
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        View view = convertView;
        if (view == null)
            view = _context.LayoutInflater.Inflate(Resource.Layout.PersonListItem, null);


        Kunde kunde = _kunden[position];
        TextView textview = view.FindViewById<TextView> (Resource.Id.nameTextView);

        textview.Text = kunde.Name;

        if (String.IsNullOrEmpty (kunde.Nummer))
            view.FindViewById<TextView> (Resource.Id.NummerTextView).Visibility = ViewStates.Gone;
        else
            view.FindViewById<TextView> (Resource.Id.NummerTextView).Text = kunde.Nummer;

        return view;
    }
}

public class LieferantViewAdapter : BaseAdapter<BusinessLayer.Lieferant>
{
    private readonly Activity _context;
    private List<Lieferant> _lieferant;

    public LieferantViewAdapter(Activity context, IEnumerable<Lieferant> lieferant)
    {
        _lieferant = lieferant.ToList ();
        _context = context;
    }

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

    public override long GetItemId(int position)
    {
        return Convert.ToInt64 ( _lieferant[position].ID);
    }

    public override Lieferant this[int position]
    {
        get { return _lieferant[position]; }
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        View view = convertView;
        if (view == null)
            view = _context.LayoutInflater.Inflate(Resource.Layout.PersonListItem, null);

        Lieferant lieferant = _lieferant[position];
        TextView textview = view.FindViewById<TextView> (Resource.Id.nameTextView);

        textview.Text = lieferant.Name;

        if (String.IsNullOrEmpty (lieferant.Nummer))
            view.FindViewById<TextView> (Resource.Id.NummerTextView).Visibility = ViewStates.Gone;
        else
            view.FindViewById<TextView> (Resource.Id.NummerTextView).Text = lieferant.Nummer;

        return view;
    }
}
}

【问题讨论】:

    标签: android listview xamarin


    【解决方案1】:

    首先在类中声明View selectedRow;,然后在setonitemclickListner中添加以下代码

    if (selectedRow != null) {
                selectedRow.setBackgroundResource(color.transparent);
            }
            selectedRow = view;
            view.setBackgroundResource(R.drawable.list_background); 
    

    这将在 3.0 及更高版本中正常工作

    【讨论】:

    • 感谢您的帮助。我只需要对 Xamarin.Android 进行一些更改,但它完全可以工作。
    • 这是不正确的,因为它会突出显示被点击的每一行。它也会弄乱视图回收。 仅凭此代码不足以实现正确的行为,应对其进行编辑
    • @Alex.F 你试过我的答案吗,试一次,让我知道它不会突出显示每一行。正如我所说,它在 3.0 以上版本的 android 上运行良好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多