У меня есть элементы в моем списке с 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
- Добавлен эти строки после запуска из convertView (КРП/другое)
- 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);
}
Не может быть связано, но вы попытались поставить код 'onClickListener' вне блока' convertView == null'? – hypd09
Если я это сделаю, как я узнаю, какая кнопка в элементе (в списке) была нажата? – Siddharth
У вас есть позиция. – fasteque