2015-06-05 3 views
0

У меня есть пользовательский адаптер, который расширяет ArrayAdapter. У меня разные раскладки для разных предметов. Мне нравится делать предметы, относящиеся к конкретному типу unclickable. Вот мой код:Установить конкретный элемент unclickable ListView android

package android.adapters; 

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Switch; 
import android.widget.TextView; 

import java.util.ArrayList; 
import java.util.List; 

import android.items.ItemProperties; 



public class CustomAdapter extends ArrayAdapter<ItemProperties> { 

private static final int TYPE_ITEM_AMOUNTS = 0; 
private static final int TYPE_ITEM_LIMITS = 1; 
private static final int TYPE_MAX_COUNT = 2; 


private LayoutInflater mInflater; 
private ArrayList<Integer> positions = new ArrayList<Integer>(); 
private List<ItemProperties> items = new ArrayList<ItemProperties>(); 

public CustomAdapter(Context context, int resource, List<ItemProperties> itemCards, ArrayList positions) { 
    super(context, resource, items); 
    this.positions = positions; 
    this.items = items; 
} 

@Override 
public int getCount() { 
    return items.size(); 
} 

@Override 
public ItemProperties getItem(int position) { 
    return items.get(position); 
} 

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflaterRow = (LayoutInflater) getContext() 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View rowView = null; 
    int type = getItemViewType(position); 
    switch (type) { 
     case TYPE_ITEM_AMOUNTS: 
      rowView = inflaterRow.inflate(R.layout.item_details, parent, false); 
      rowView.setEnabled(false); 
      rowView.setOnClickListener(null); 
      TextView txtName = (TextView) rowView.findViewById(R.id.text_name); 
      txtName.setText(itemCards.get(position).getCardLabelDesc()); 
      TextView txtValue = (TextView) rowView.findViewById(R.id.text_value); 
      txtValue.setText(itemCards.get(position).getCardLabelValue()); 
      break; 
     case TYPE_ITEM_LIMITS: 
      rowView = inflaterRow.inflate(R.layout.item_limit_settings, parent, false); 
      rowView.setEnabled(true); 
      TextView txtLimitDesc = (TextView) rowView.findViewById(R.id.text_item_description); 
      txtLimitDesc.setText(itemCards.get(position).getCardLabelDesc()); 
      Switch limitEnable = (Switch) rowView.findViewById(R.id.enable_limit); 
      limitEnable.setText(""); 
      TextView txtLimit = (TextView) rowView.findViewById(R.id.txt_limit); 
      txtLimit.setText(itemCards.get(position).getCardLabelValue()); 
      break; 
    } 
    return rowView; 
} 

@Override 
public int getViewTypeCount() { 
    return TYPE_MAX_COUNT; 
} 

@Override 
public int getItemViewType(int position) { 
    if (positions.contains(position)) 
     return TYPE_ITEM_LIMITS; 
    else 
     return TYPE_ITEM_AMOUNTS; 
    } 
    } 

Однако это не работает для меня, ничто не доступно для контакта.

В деятельности, в которой я заселить список у меня есть это:

propertiesAdapter=new  
    CustomAdapter(this,R.layout.item_details,itemPropertiesList,positions); 
    listDetails.setAdapter(propertiesAdapter); 
    listDetails.setOnItemClickListener(this); 

и у меня есть onItemClick обработчик событий.

Кто-нибудь знает, в чем проблема?

+0

Что произойдет, если вы удалите rowView.setEnabled (false); rowView.setOnClickListener (нуль); от случая TYPE_ITEM_AMOUNTS. Затем оба типа элементов становятся кликабельными? – random

+0

Нет, первый тип доступен для кликабельности, второй нет, и я хочу архивировать обратное – vikifor

+0

Является ли listDetails интерфейсом ListView? Является ли listDetails ссылкой на ID в макете для ListView? –

ответ

1

В типе TYPE_ITEM_AMOUNTS вы устанавливаете запрет на просмотр и OnClickListener null, поэтому он не доступен для кликов, я думаю, это именно то, что вы хотите;

В типе TYPE_ITEM_LIMITS у вас есть переключатель здесь, но вы не устанавливаете OnCheckedChangeListener для коммутатора. Когда вы используете OnItemClickListener для ListView, помните об этом: если в элементе списка есть что-то, что можно нажать (кнопка или в вашем случае, переключатель), то метод onItemClick() никогда не будет работать. почему в вашем ListView ничего нельзя щелкнуть.

Вы должны установить все виды в своем списке неактивными, чтобы onItemClick() мог работать нормально. Другим способом не используйте OnItemClickListener, просто установите OnCheckedChangeListener для вашего переключателя для обработки события click.

0

Вам необходимо переопределить два дополнительных метод в адаптере:

@Override 
public boolean areAllItemsEnabled() { 
    return false; 
} 

@Override 
public boolean isEnabled(int position) { 
    return (position >= 0) && (position < getCount()) && !isSeparator(position); 
} 

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

0

Ваш код, указанный ниже, для меня не имеет смысла. Это позволит отключить отображение всего макета. item_details - это ваш макет с элементами для ListView, я считаю.

rowView = inflaterRow.inflate(R.layout.item_details, parent, false); 
rowView.setEnabled(false); 

Предложенное код из GetView() случай TYPE_ITEM_AMOUNTS:

TextView txtName = (TextView) rowView.findViewById(R.id.text_name); 
txtName.setEnabled(false); 

. Примечания:

  • Я подозреваю код rowView = inflaterRow.inflate (R.layout item_details является view for all layout. Таким образом, rowView вводит в заблуждение, общее имя для него - convertView.
  • Код, txtN ame.setEnabled (false), отключит определенную позицию позиции в ListView. Разница основного кода: txtName.setEnabled()
  • Удалить код rowView.setEnabled (false);
  • Я думаю, что ответ Ай Хао тоже правильный, но он менее ясен и может противоречить коду, который я предлагаю.