От метода itemclick в адаптера как да промените текстовия изглед в дейността

Имам проста дейност, която е textview и listview. Моят изглед на списък използва персонализиран адаптер за показване на данни също в адаптера, имам метод itemClick. Бих искал да променя текстовия изглед, след като щракна върху елемента от списъка. Проблемът ми е, че не знам как да намеря текстовия изглед от адаптера за списък? Ще опитам нещо подобно:

  TextView TeamSelect = (TextView)activity.FindViewById(Resource.Id.tvSelectPlayers);
           TeamSelect.SetText("Players", TextView.BufferType.Normal);

но това ми дава грешка:

 System.NullReferenceException: Object reference not set to an instance of an object

Ето моят адаптер:

public HomePlayersAdapter(Activity context)
    { 
        mInflater = LayoutInflater.From(context);
        mSelectedItemsIds = new SparseBooleanArray();
        this.context = context;
public override int Count            //return number of items in the list
    {
        get { return homePlayers.Count; }
    }
    public override Java.Lang.Object GetItem(int position)
    {
        return position;
    }

   public Player GetObject(int position)
    {
        return this.homePlayers.ElementAt(position);
    }
    public override long GetItemId(int position)
    {
        return position;
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
     var y = (itemPos.IndexOf(position) + 1);
     var item = homePlayers[position];
        if (convertView == null || holder == null)
        {
            convertView = mInflater.Inflate(Resource.Layout.RowPlayers, null);
            holder = new ViewHolder();
            holder.playerName = convertView.FindViewById<TextView>(Resource.Id.tvRow); //set holder label with label list id in the view
            convertView.Tag = (holder);
     }
        else
        {
            holder = (ViewHolder)convertView.Tag;
        }
        holder.playerName.SetText(item.firstName + " " + item.lastName, TextView.BufferType.Normal);//set data label
        holder.playerName.TextSize = 30;

        if (clickCount >= 15)
        {
            subs = 1;
            Android.Widget.Toast.MakeText(context, "ok", Android.Widget.ToastLength.Short).Show();
        }
        else
        {
            subs = 0;
        }

        y = (itemPos.IndexOf(position) + 1);
        if (itemPos.Contains(position))
        {
            holder.playerName.SetTextColor(mInflater.Context.Resources.GetColor(Resource.Drawable.green));
            holder.playerName.SetText(y + ". " + item.firstName + " " + item.lastName, TextView.BufferType.Normal);//set data label
        }
        else
        {                holder.playerName.SetTextColor(mInflater.Context.Resources.GetColor(Resource.Drawable.white));
        }
        return convertView;
    }
   public void itemClick(int position)
    {

        if (!itemPos.Contains(position))
        {
            clickCount++;
            var selectFixtureActivity = new Intent(context, typeof(SelectPlayers));
            selectFixtureActivity.PutExtra("clickCount", clickCount);

            holder.playerName.SetTextColor(mInflater.Context.Resources.GetColor(Resource.Drawable.green));
            itemPos.Add(position);
            NotifyDataSetChanged();
            insertPlayer(position);
    }
        else
        {
            clickCount--;
            var selectFixtureActivity = new Intent(context, typeof(SelectPlayers));
            selectFixtureActivity.PutExtra("clickCount", clickCount);
            holder.playerName.SetTextColor(mInflater.Context.Resources.GetColor(Resource.Drawable.white));
            deletePlayer(position);
            int po = itemPos.IndexOf(position);
            itemPos.RemoveAt(po);
            NotifyDataSetChanged();
 class ViewHolder : Java.Lang.Object
{
    public TextView playerName;
}

И моята дейност:

 protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.SelectPlayer);

        homeListAdapter = new HomePlayersAdapter(this);
        listView = FindViewById<ListView>(Resource.Id.lvSelectPlayers);
        TextView TeamSelect = FindViewById<TextView>(Resource.Id.tvSelectPlayer);
        listView.Adapter = homeListAdapter;


        listView.ChoiceMode = ChoiceMode.Multiple;
        this.listView.ChoiceMode = ChoiceMode.Multiple;
        var nameHome = Intent.GetStringExtra("nameHome");
        var clickCount = Intent.GetStringExtra("clickCount");

        TextView homeTeam = (TextView)FindViewById(Resource.Id.tvHomeTeam);
        homeTeam.SetText(nameHome, Button.BufferType.Normal);

        this.listView.ItemClick += (sender, e) =>
        {
           homeListAdapter.itemClick(e.Position);
        }

Опитах се да направя това по различен начин: изпращам променлива clickCount към дейността и там в метода ItemClick се опитах да променя текстовия изглед, но clickCount var в началото се изпраща към acticity, но когато методът ItemClick завърши, clickCount променя стойността на null. Как мога ли да реша този проблем?


person user3897367    schedule 14.08.2014    source източник
comment
И каква е тази грешка? Моля, редактирайте публикацията си, за да включите тази информация.   -  person gunr2171    schedule 15.08.2014
comment
актуализиран с подробности за грешката   -  person user3897367    schedule 15.08.2014
comment
Моля, публикувайте кода за вашата дейност и адаптер   -  person Spidy    schedule 15.08.2014
comment
актуализиран с адаптер и активност   -  person user3897367    schedule 15.08.2014


Отговори (1)


Не трябва да осъществявате достъп до дейността директно от адаптера. Трябва да зададете слушател на адаптера (слушателят може да бъде Activity). Това се основава на модела на наблюдателя. Той отделя компонентите и насърчава повторната употреба. След това дейността, когато бъде извикана, може да промени своя собствен текстов изглед.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);
    ListView myListView = (ListView)findViewById(R.id.your_list);
    final TextView myTextView = (TextView)findViewById(R.id.your_text);
    YourAdapter adapter = new YourAdapter();
    adapter.setListener(new CustomListener() { // You write this method in your adapter
        @Override
        public void onItemClicked(Item clickedItem) {
            myListView.setText( clickedItem.toString() );
        }
    });
}

Или ако не правите нищо специално в персонализирания адаптер, винаги можете да използвате вградения слушател за списъчен изглед.

myListView.setOnItemClickListener( new OnItemClick() { // This is not onClick, but onItemClick
    @Override
    public void onItemClicked(AdapterView<?> parent, View view, int position, long id) {
        Object clickedItem = parent.getItemAtPosition(position);
        myTextView.setText( clickedItem.toString() );
    }
});
person Spidy    schedule 14.08.2014