Android установлен для просмотра видимости внутри ListAdapter

У меня есть listview с arrayadapter. Я хочу, чтобы при нажатии кнопки внутри элемента списка определенное представление в этом элементе (а не в других элементах) было видимым или невидимым.

Вот код, который я делаю в адаптерах getView ():

@Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = vi.inflate(layoutResourceId, null, false); holder = new Holder(); holder.setShare((ImageView) convertView.findViewById(R.id.share)); holder.setShareButtons((LinearLayout)convertView.findViewById(R.id.shareButtons)); convertView.setTag(holder); } holder = (Holder) convertView.getTag(); holder.getShare().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(holder.getShareButtons().getVisibility()==View.GONE){ holder.getShareButtons().setVisibility(View.VISIBLE); } else{ holder.getShareButtons().setVisibility(View.GONE); } } }); return convertView; } 

Но все, что я получаю, – странное поведение. Методы onClickListener и setVisibilty вызываются правильно, но мой взгляд иногда становится видимым, а иногда и нет, и это зависит от позиции прокрутки списка.

Что я делаю неправильно и как мне это решить?

Когда прокручивается просмотр списка, дочерние представления повторно используются и переназначаются на новые позиции. Это для эффективности, поскольку создание новых представлений дорого. Однако это накладывает нагрузку на программиста – при каждом вызове getView вы должны полностью сбросить каждое значение вида. Поэтому, если нажатие кнопки в дочернем элементе изменяет видимость одного из его членов, вам нужно помнить, какая видимость должна быть для каждой числовой позиции, а в getView вы должны установить соответствующую видимость для каждого элемента.

Держатель должен поддерживать ссылки на внутренние взгляды по соображениям производительности. Это не связано с данными, которые представлены в вашем списке – только для «ячеек» в вашем списке. Вы должны определить, видимы ли данные или нет на основе ваших данных.

Вот фрагмент моего адаптера, который даст вам пример того, как реагировать на щелчок элемента внутри самого адаптера:

Функциональность: каждая строка представляет собой объект, который можно увидеть или не увидеть. Независимо от того, видно это или нет, изображение отличается. Нажатие на элемент переключает изображение вкл / выкл.

 public class Exampledapter extends ArrayAdapter<CustomObject> { private Context mContext; private int mLayoutResourceId; private ArrayList<CustomObject> mData = null; public ExampleAdapter(Context context, int layoutResourceId, ArrayList<CustomObject> data, DataSource datasource) { super(context, layoutResourceId, data); this.mLayoutResourceId = layoutResourceId; this.mContext = context; this.mData = data; } @Override public View getView(final int position, View convertView, ViewGroup parent) { View lRow = convertView; ViewHolder holder = null; if (lRow == null) { LayoutInflater lInflater = ((Activity) mContext).getLayoutInflater(); lRow = lInflater.inflate(mLayoutResourceId, parent, false); holder = new ViewHolder(); holder.txtTitle = (TextView) lRow.findViewById(R.id.text_); holder.imageSeen = (ImageView) lRow.findViewById(R.id.image_toggle); lRow.setTag(holder); } else { holder = (ViewHolder) lRow.getTag(); } holder.imageSeen.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { onListItemClick(position); } }); if (mData.get(position).getSeen() == 1) { holder.imageSeen.setImageBitmap(mImageSeen); } else { holder.imageSeen.setImageBitmap(mImageUnseen); } holder.txtTitle.setText(mData.get(position).getTitle()); return lRow; } protected void onListItemClick(int position) { if (mData.get(position).isSeen()) { mData.get(position).setSeen(0); } else { mData.get(position).setSeen(1); } notifyDataSetChanged(); } class ViewHolder { TextView txtTitle; ImageView imageSeen; } }