设置特定项目不可点击的ListView android



我有扩展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事件处理程序。

有谁知道是什么问题吗?

在type_item_amount中,您将视图设置为禁用,并将OnClickListener设置为null,因此它不可点击,我猜这正是您想要的;

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

你应该设置列表中的所有视图不可聚焦,这样onItemClick()才能正常工作。或者另一种方式,不使用OnItemClickListener,只是设置OnCheckedChangeListener为您的交换机处理点击事件

您需要在适配器中覆盖两个额外的方法:

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

有一些问题,可能会导致点击侦听器运行,即使在禁用的项目(一些复杂的手势,拖动等),所以添加一个检查到您的点击侦听器,以避免意外的反应,不可点击的项目

您下面列出的代码对我来说没有意义。这会将整个布局视图设置为禁用。item_details是你的布局与项目的ListView,我相信。

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

建议代码,来自getView() case type_item_amount:

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

指出:

  • 我怀疑代码rowView = inflaterrow . inflation (r.p layout.)item_details是整个布局的视图。因此,rowView是误导性的,它的通用名称是convertView。
  • 代码txtName.setEnabled(false)将禁用ListView中的某个行位置。主要的代码差异是txtName.setEnabled()
  • 删除代码rowView.setEnabled(false);
  • 我认为艾浩的答案也是正确的,但不太清楚,可能与我建议的代码相冲突。

相关内容

  • 没有找到相关文章

最新更新