【问题标题】:Set particular item unclickable ListView android设置特定项目不可点击的ListView android
【发布时间】:2015-06-05 08:10:39
【问题描述】:

我有扩展 ArrayAdapter 的自定义适配器。我对不同的项目有不同的布局。我喜欢制作来自特定类型unclickable 的物品。这是我的代码:

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 事件处理程序。

有人知道是什么问题吗?

【问题讨论】:

  • 如果删除 rowView.setEnabled(false); 会发生什么rowView.setOnClickListener(null);来自 TYPE_ITEM_AMOUNTS 案例。那么这两种类型的项目都可以点击了吗?
  • 不行,第一种可点击,第二种不可点击,我要归档相反的
  • listDetails 是 ListView UI 吗? listDetails 是否引用了 ListView 布局中的 ID?
  • listDetails = (ListView)findViewById(R.id.list_details);我有这个,所以是 ListView UI
  • 发布 R.layout.item_details 的布局。我认为这个ID可能会混淆。

标签: android android-listview onitemclick


【解决方案1】:

在TYPE_ITEM_AMOUNTS的类型中,你设置view为disabled,OnClickListener为null,所以不能点击,我猜这正是你想要的;

在TYPE_ITEM_LIMITS类型中,你这里有一个Switch,但是你没有为这个开关设置一个OnCheckedChangeListener。 当您为 ListView 使用 OnItemClickListener 时,请记住:如果您的列表项中有任何可以单击的内容(按钮,或者在您的情况下为开关),那么 onItemClick() 方法将永远无法工作。这就是为什么您的 listView 中没有可点击的内容。

您应该将列表中的所有视图设置为不可聚焦,以便 onItemClick() 可以正常工作。或者另一种方式,不要使用 OnItemClickListener ,只需为您的开关设置一个 OnCheckedChangeListener 来处理点击事件。

【讨论】:

    【解决方案2】:

    您需要覆盖适配器中的两个附加方法:

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

    有一些问题可能会导致点击监听器在禁用的项目上运行(对于一些复杂的手势、拖动等),因此请为您的点击监听器添加一个检查以避免对不可点击的项目做出意外反应。

    【讨论】:

      【解决方案3】:

      您下面列出的代码对我来说没有意义。这会将整个布局视图设置为禁用。我相信 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 是整个布局的视图。因此 rowView 具有误导性,它的通用名称是 convertView。
      • 代码 txtName.setEnabled(false) 将禁用 ListView 中的某个行位置。主要代码区别是 txtName.setEnabled()
      • 删除代码rowView.setEnabled(false);
      • 我认为艾浩的回答也是正确的,但不太清楚,可能与我建议的代码冲突。

      【讨论】:

        猜你喜欢
        • 2012-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多