2014-01-17 5 views
0

У меня есть элементы в моем списке с ImageView. Когда я нажимаю ImageView в строке , сначала, 4-й ряд элемент также получает щелчок. Почему onClick получает резьбу? У меня есть new OnClickListener() для каждой кнопки на каждом элементе?ListView onClick Слушатели смешаны

public View getView(int position, View convertView, ViewGroup parent) { 
      final BuddyViewHolder viewHolder; 
      if (convertView == null || convertView.getTag() == null) { 
       convertView = inflater.inflate(R.layout.buddy, null); 
       viewHolder = new BuddyViewHolder(); 
       allBuddiesViewHolder.add(position, viewHolder) ; 

       viewHolder.position = position; 
       viewHolder.root = (LinearLayout) convertView 
         .findViewById(R.id.root); 
          viewHolder.request = (ImageView) convertView 
        .findViewById(R.id.request); 

       //removed all other viewholder init's 
       viewHolder.request.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         if (selectedBuddy == NO_BUDDY_SELECTED) { 
          viewHolder.request.setVisibility(View.GONE); 
          viewHolder.cancel.setVisibility(View.VISIBLE); 
          viewHolder.root.setSelected(true); 
          selectedBuddy = viewHolder.position; 
         } else { 
          Toast.makeText(context, 
            "You can make only one request at a time.", 
            Toast.LENGTH_LONG).show(); 
         } 
        } 
       }); 

       convertView.setTag(viewHolder); 
      } else 
       viewHolder = (BuddyViewHolder) convertView.getTag(); 

      // here I am setting the values from a arraylist 
        String company = allBuddies.get(position).emailId.substring(
        allBuddies.get(position).emailId.indexOf("@"), 
        allBuddies.get(position).emailId.indexOf(".")); 
      viewHolder.name.setText(allBuddies.get(position).name); 
      viewHolder.company.setText(company.toLowerCase()); 
      //removed some lines here. 
      return convertView; 
     } 

ListView XML является

<ListView 
      android:id="@android:id/list" 
      android:layout_width="fill_parent" 
      android:layout_height="0dip" 
      android:layout_marginBottom="10dp" 
      android:layout_marginLeft="10dp" 
      android:layout_marginRight="10dp" 
      android:layout_weight="1" 
      android:background="@drawable/roundcornersgreyback" 
      android:descendantFocusability="blocksDescendants" 
      android:divider="#ffffff" 
      android:dividerHeight="5dp" 
      android:duplicateParentState="true" 
      android:scrollbarAlwaysDrawVerticalTrack="true" 
      android:scrollbarSize="3dp" 
      android:scrollbarStyle="outsideOverlay" 
      android:scrollbars="vertical" 
      android:scrollingCache="true" 
      android:smoothScrollbar="true" /> 

Компоновка элемент (приятель) (релевантно только ImageView)

<ImageView 
     android:id="@+id/request" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:layout_weight="3" 
     android:adjustViewBounds="true" 
     android:background="@drawable/roundcornerblue_button" 
     android:enabled="true" 
     android:src="@drawable/button_request" 
     android:visibility="visible" /> 

Первопричины

@fasteque

Да, я думаю, проблема связана с механизмом повторного использования строк, предоставляемым Android. Когда convertView не равно null, вы возвращаете представление, для которого вы уже установили прослушиватель (но он был предназначен для другой строки). Чтобы быть уверенным в этом, отключите шаблон viewHolder, просто создавайте новое представление каждый раз: я думаю, это сработает. Затем, если это так, переместите onClickListener, как предлагается здесь выше.

Fix

  1. Добавлен эти строки после запуска из convertView (КРП/другое)
  2. Set allBuddies.get(position).isRequestSent = true в моем инлайн OnClick

Мой Impression

OnItemClickListener way wou Мне нужно много взлома. Я предпочитаю inline onClick в этом конкретном случае.

if (allBuddies.get(position).isRequestSent) { 
       viewHolder.cancel.setVisibility(View.VISIBLE); 
       viewHolder.request.setVisibility(View.GONE); 
       viewHolder.confirm.setVisibility(View.GONE); 
      } else { 
       viewHolder.request.setVisibility(View.VISIBLE); 
       viewHolder.cancel.setVisibility(View.GONE); 
       viewHolder.confirm.setVisibility(View.GONE); 
      } 
+0

Не может быть связано, но вы попытались поставить код 'onClickListener' вне блока' convertView == null'? – hypd09

+0

Если я это сделаю, как я узнаю, какая кнопка в элементе (в списке) была нажата? – Siddharth

+0

У вас есть позиция. – fasteque

ответ

1

Я думаю, проблема связана с механизмом повторного использования строк, предоставляемым Android. Когда convertView не является нулевым, вы возвращаете представление, для которого вы уже установили прослушиватель (но он был предназначен для другой строки).

Чтобы убедиться в этом, попробуйте выполнить этот тест: отключите шаблон viewHolder, просто создайте новое представление каждый раз. Я думаю, это сработает.

Затем, если это так, переместите onClickListener вне блока convertView == null, как было предложено в первом комментарии.