2014-09-27 1 views
0

Мне нужна небольшая помощь: у меня есть список с настраиваемым элементом списка и узлом просмотра. Код, который я скопировал, представляет собой адаптер, который я использую, но более простую версию. Ради простоты, скажем, у меня есть ImageView и LinearLayout внутри каждого элемента ListView. Я хотел бы применить setOnClickListener к каждому элементу, который должен сделать следующее: изменить видимость элемента LinearLayout внутри ДРУГОГО элемента, так что в другом положении (например, всегда 5-го). Очевидно, если я назову holder.rl.setvisibility(..), он изменит видимость в том же положении. Я предполагаю, что могу как-то ссылаться на элемент, который мне нужно изменить, но я не уверен. Как вы, ребята, могли это сделать?Ссылка на другой элемент внутри ListView с ViewHolder

public class ImageAdapter extends BaseAdapter { 


    private Context mContext; 

    public ImageAdapter(Context mContext) { 
     this.mContext = mContext; 
    } 
    @Override 
    public int getCount() { 
     return bImageList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     View view = convertView; 
     if (view == null) { 
      view = getActivity().getLayoutInflater().inflate(R.layout.discover_item_layout_my, parent, false); 
      holder = new ViewHolder(); 
      assert view != null; 

      holder.itemImage = (ImageView) view.findViewById(R.id.main_discover_listitem_itemimage); 
      holder.ll = (LinearLayout) view.findViewById(R.id.anim_rl); 

      view.setTag(holder); 
     } else { 
      holder = (ViewHolder) view.getTag(); 
     } 

     holder.ll.setVisibility(View.VISIBLE); 

     holder.itemImage.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        //need to set holder.ll visibility to GONE but in another position 
       } 
      }); 

      return view; 
     } 

     class ViewHolder { 
      ImageView itemImage; 
      LinearLayout ll; 
     } 
    } 

Спасибо, ребята!

+0

просто u массив истинных/ложных в adaptaetr constacrter и когда u щелкните обновленный адаптер –

+0

Его хорошо, но как я могу изменить макет, например, 5-го элемента? –

+0

if (position == 5) {} чем somethink –

ответ

1

Я приложил код, подробно описывающий, что делать. Это от верхней части головы, поэтому для компиляции может потребоваться небольшая настройка. Надеюсь, это все перевернет.

Просто создайте глобальное поле, которое отслеживает видимость видимости пятой позиции.

private int mFifthVisibility = View.VISIBLE; //Starting value. 

Тогда в onClickListener просто переключить эту переменную и вызвать notifyDataSetChanged()

holder.itemImage.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     mFifthVisibility = View.GONE; //Or Invisible 
     notifyDataSetChanged(); 
    } 
}); 

Наконец, в методе getView(), обновить видимость вашей точки зрения как так:

holder.ll.setVisibility((position == 5) ? mFifthVisibility : View.VISIBLE); 

примечание стороны, если вы специально делаете это по какой-либо причине, ваш метод getItem() должен возвращать значение. Не ноль. Это будет путать любого другого программиста, использующего ваш код.

+0

Позор мне. Хороший! Я поставил notifyDataSetChanged где-то в неправильном месте. Спасибо, Джей Сойер! –

+0

Еще одна вещь: notifyDataSetChanged обновляет весь список, у меня есть изображения из базы данных для загрузки. Как я могу сказать, ТОЛЬКО, что 5-й предмет должен быть обновлен? (так что другие не обновляются) –

+0

Вы не можете ... легко. Работа будет состоять в том, чтобы отслеживать и хранить каждый сгенерированный вид по положению на какой-то карте WeakReferenced. Это сложно, и вы найдете различные граничные случаи, где он потерпит неудачу. Кроме того, эта идея противоречит тому, как адаптеры предназначены и предназначены для использования. 'NotifyDataSetChange', будет только обновлять видимые позиции ... не все позиции. Попробуйте вместо этого кэшировать изображения. Где вы сначала пытаетесь вытащить кеш, то вы вытаскиваете из БД. –

Смежные вопросы