首页 > 解决方案 > 单击和longItemClick listview c#vs2017时Xamarin得到错误的项目

问题描述

过滤数据和 LongItemClick 时我得到错误的数据,当我单击 ItemClick 时也得到错误的数据。我们能帮帮我吗?

我需要改变什么才能正常工作?

我发送模型、活动和适配器。

有我的模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;

 namespace NovaAndroid.Model
{
 public class the_SetSubjModel
 {

    public string acSubject { get; set; }


    public string acAddress { get; set; }


    public string acName2 { get; set; }


    public string acPost { get; set; }


    public string acCountry { get; set; }


    public string acCode { get; set; }


    public string acPhone { get; set; }


    public string acRegNo { get; set; }


    public decimal anRebate { get; set; }


    public string acBuyer { get; set; }


    public static explicit operator the_SetSubjModel(Java.Lang.Object v)
    {
        throw new NotImplementedException();
    }
}
}   

有我的适配器:

using System;
using System.Collections.Generic;

using Android.App;
using Android.Content;
using Android.Views;
using Android.Widget;
using NovaAndroid.Model;

namespace NovaAndroid.Adapters
{
[Activity(Label = "ContactListBaseAdapter")]
public partial class ContactListBaseAdapter : BaseAdapter<the_SetSubjModel>
{

    IList<the_SetSubjModel> contactListArrayList;
    private LayoutInflater mInflater;
    private Context activity;     


    public ContactListBaseAdapter(Context context, IList<the_SetSubjModel> 
 results)
    {
        this.activity = context;          

        contactListArrayList = results;
        mInflater = 
(LayoutInflater)activity.GetSystemService(Context.LayoutInflaterService);
    }

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

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

    public override the_SetSubjModel this[int position]
    {
        get { return contactListArrayList[position]; }
    }

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

我认为 GetView 方法有问题?public override View GetView(int position, View convertView, ViewGroup parent) {

        ContactsViewHolder holder = null;
        if (convertView == null)
        {
            convertView = 
 mInflater.Inflate(Resource.Layout.list_row_contact_list, null);
            holder = new ContactsViewHolder();
            // Show item in listView
            holder.txtacSubject = convertView.FindViewById<TextView> 
 (Resource.Id.lr_fullName);
            holder.txtacAddress = convertView.FindViewById<TextView> 
(Resource.Id.lr_address);
            holder.txtEmail = convertView.FindViewById<TextView> 
(Resource.Id.lr_email);
            holder.txtPib = convertView.FindViewById<TextView> 
(Resource.Id.lr_pib);              

            convertView.Tag = holder;             

        }
        else
        {              
            holder = convertView.Tag as ContactsViewHolder;                
        }

        holder.txtacSubject.Text = 
contactListArrayList[position].acSubject.ToString();
        holder.txtacAddress.Text = contactListArrayList[position].acAddress;
        holder.txtEmail.Text = contactListArrayList[position].acPost;
        holder.txtPib.Text = contactListArrayList[position].acCode;


        if (position % 2 == 0)
        {

convertView.SetBackgroundResource(Resource.Drawable.list_selector);
        }
        else
        {

convertView.SetBackgroundResource(Resource.Drawable.list_selector_alternate);
        }           

        return convertView;

    }       

        public IList<the_SetSubjModel> GetAllData()
    {
        return contactListArrayList;
    }

    public class ContactsViewHolder : Java.Lang.Object
    {
        public TextView txtacSubject { get; set; }
        public TextView txtacAddress { get; set; }
        public TextView txtEmail { get; set; }
        public TextView txtPib { get; set; }            
        public TextView txtacName2 { get; set; }
        public TextView txtacPhone { get; set; }
        public TextView txtacRegNo { get; set; }
        public TextView txtanRebate { get; set; }
    }

    class ContactListBaseAdapterViewHolder : Java.Lang.Object
    {
        //Your adapter views to re-use
        //public TextView Title { get; set; }
    }
}
}

有我的活动:

using Android.App;
using Android.Content;
using Android.OS;
using Android.Widget;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using NovaAndroid.Model;
using NovaAndroid.Adapters;
using Android.Views;

namespace NovaAndroid
{
[Activity(Label = "Svi kupci", MainLauncher = false)]
public class ToDoItemActivity : Activity
{
    //Button btnAdd;
    private SearchView sv;
    private ListView lista;
    private ArrayAdapter adapter;
    IList<the_SetSubjModel> listaToDo = null;
    List<the_SetSubjModel> readed = new List<the_SetSubjModel>();
    the_SetSubjModel model = new the_SetSubjModel();
    EditText  contactList_txtSearch;
    Button btnHomeScreen;

    private const string URL = 
"http://192.168.147.10:8888/Service.svc/GetAllSubjectWithoutBuyer";

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        SetContentView(Resource.Layout.ToDoItemView);

        btnHomeScreen = FindViewById<Button>(Resource.Id.buttonHome);
        btnHomeScreen.Click += BtnHomeScreen_Click;
        GetAllSubjectWithoutBuyer();          

        var str = readed.Select(x => x.acSubject).ToList();

        var listView = FindViewById<ListView>(Resource.Id.listView);

        contactList_txtSearch = FindViewById<EditText> 
(Resource.Id.contactList_txtSearch);

        lista = (ListView)FindViewById(Resource.Id.listView);
        lista.Adapter = new ArrayAdapter<String>(this, 
Android.Resource.Layout.SimpleListItem1, str);

        lista = FindViewById<ListView>(Resource.Id.listView);
        sv = FindViewById<SearchView>(Resource.Id.searchView);
        adapter = new ArrayAdapter(this, 
Android.Resource.Layout.SimpleListItem1, str);
        lista.Adapter = adapter;

        listaToDo = readed;

        contactList_txtSearch.TextChanged += 
ContactList_txtSearch_TextChanged;     

        lista.ItemClick += Lista_ItemClick;

        lista.ItemLongClick += Lista_ItemLongClick;

        //
        lista.Adapter = new ContactListBaseAdapter(this, listaToDo);

    }       

    private void BtnHomeScreen_Click(object sender, EventArgs e)
    {
        var activityHome = new Intent(this, typeof(MainActivity));
        StartActivity(activityHome);
    }

    private void GetAllSubjectWithoutBuyer()
    {
        WebRequest request = WebRequest.Create(URL);
        request.Method = "GET";
        request.ContentType = "application/json";
        //request.ContentLength = DATA.Length;

        try
        {
            using (var webClient = new System.Net.WebClient())
            {
                var json = 

  webClient.DownloadString("http://192.168.147.10:8888/
Service.svc/GetAllSubjectWithoutBuyer");
                SResult web = JsonConvert.DeserializeObject<SResult>(json);
                readed = web.GetAllSubjectWithoutBuyerResult;

            }
        }

        catch (Exception ex)
        {

        }
    }

private void ContactList_txtSearch_TextChanged(object sender, 
Android.Text.TextChangedEventArgs e)
    {
        var searchText = contactList_txtSearch.Text;

        //Compare the entered text with List  
        List<the_SetSubjModel> list = (from items in readed
                                    where 
items.acCode.Contains(contactList_txtSearch.Text)

                                    select items).ToList<the_SetSubjModel>();

        lista.Adapter = new ContactListBaseAdapter(this,list);
        this.lista.DeferNotifyDataSetChanged();
    }      

    private void Lista_ItemLongClick(object sender, 
AdapterView.ItemLongClickEventArgs e)
    {
        the_SetSubjModel o = readed[e.Position];
        var activityAddEdit = new Intent(this, typeof(AddEditActivity));
        activityAddEdit.PutExtra("acSubject", o.acSubject.ToString());
        activityAddEdit.PutExtra("acAddress", o.acAddress.ToString());
        activityAddEdit.PutExtra("acPost", o.acPost.ToString());
        activityAddEdit.PutExtra("acCode", o.acCode.ToString());
        activityAddEdit.PutExtra("acCountry", o.acCountry.ToString());
        activityAddEdit.PutExtra("acName2", o.acName2.ToString());
        activityAddEdit.PutExtra("acPhone", o.acPhone.ToString());
        activityAddEdit.PutExtra("acRegNo", o.acRegNo.ToString());
        activityAddEdit.PutExtra("anRebate", o.anRebate.ToString());
        StartActivity(activityAddEdit);
    }

    private void Lista_ItemClick(object sender, 
AdapterView.ItemClickEventArgs e)
    {
        Toast.MakeText(this, adapter.GetItem(e.Position).ToString(), 
ToastLength.Short).Show();

    }  

}

图片示例ItemClick错误:

在此处输入图像描述

标签: c#androidxamarinvisual-studio-2017

解决方案


我想你已经回答了你自己的问题,好像你是从基本适配器继承的,如果你想创建一个布局充气器,你需要在你的适配器中实现 GetView() 方法。


推荐阅读