У меня есть простое действие, которое представляет собой текстовый просмотр и просмотр списка. В моем представлении списка используется настраиваемый адаптер для отображения данных также в адаптере, у меня есть метод 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 в начале отправляется в действие, но когда метод ItemClick заканчивает, изменяет значение clickCount на null. могу я решить эту проблему?

0
user3897367 15 Авг 2014 в 00:29
А что это за ошибка? Пожалуйста, отредактируйте свое сообщение, включив в него эту информацию.
 – 
gunr2171
15 Авг 2014 в 00:31
Обновлен с подробностями об ошибке
 – 
user3897367
15 Авг 2014 в 00:39
Пожалуйста, опубликуйте код для своей деятельности и адаптера
 – 
Spidy
15 Авг 2014 в 01:01
Обновлен адаптером и активностью
 – 
user3897367
15 Авг 2014 в 20:12

1 ответ

Лучший ответ

Вы не должны обращаться к Activity напрямую из адаптера. Вы должны установить слушателя на адаптере (слушателем может быть Activity). Это основано на паттерне наблюдателя. Он отделяет компоненты и способствует повторному использованию. Затем 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() );
    }
});
0
Spidy 15 Авг 2014 в 00:50