将特定项目设置为不可点击的 ListView android
Set particular item unclickable 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;
}
}
但是,这对我不起作用,没有任何内容是可点击的。
在我填充列表的 activity 中,我有这个:
propertiesAdapter=new
CustomAdapter(this,R.layout.item_details,itemPropertiesList,positions);
listDetails.setAdapter(propertiesAdapter);
listDetails.setOnItemClickListener(this);
我有 onItemClick
个事件处理程序。
有人知道问题出在哪里吗?
您需要在适配器中覆盖另外两个方法:
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return (position >= 0) && (position < getCount()) && !isSeparator(position);
}
有一些问题可能会导致点击侦听器 运行 即使在禁用的项目上(对于某些复杂的手势、拖动等),因此请检查您的点击侦听器以避免对不可点击的项目产生意外反应。
在TYPE_ITEM_AMOUNTS类型中,你设置view为disabled,OnClickListener为null,所以不能点击,我想这正是你想要的;
在TYPE_ITEM_LIMITS类型中,你这里有一个Switch,但是你没有为switch设置OnCheckedChangeListener。
当您为 ListView 使用 OnItemClickListener 时,请记住 this:If 列表项中有任何可以单击的内容(按钮,或者在您的情况下为开关),然后 onItemClick() 方法永远不会 work.This 这就是为什么您的 listView 中没有任何内容是可点击的。
您应该将列表中的所有视图设置为不可聚焦,以便 onItemClick() 可以以另一种方式工作normally.Or,不要使用 OnItemClickListener,只需为您的开关设置一个 OnCheckedChangeListener 来处理点击事件。
你下面列出的代码对我来说没有意义。这会将整个布局视图设置为禁用。 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);
- 我觉得艾豪的回答也对,但是不太清楚,可能和我建议的代码冲突。
我有扩展 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;
}
}
但是,这对我不起作用,没有任何内容是可点击的。
在我填充列表的 activity 中,我有这个:
propertiesAdapter=new
CustomAdapter(this,R.layout.item_details,itemPropertiesList,positions);
listDetails.setAdapter(propertiesAdapter);
listDetails.setOnItemClickListener(this);
我有 onItemClick
个事件处理程序。
有人知道问题出在哪里吗?
您需要在适配器中覆盖另外两个方法:
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return (position >= 0) && (position < getCount()) && !isSeparator(position);
}
有一些问题可能会导致点击侦听器 运行 即使在禁用的项目上(对于某些复杂的手势、拖动等),因此请检查您的点击侦听器以避免对不可点击的项目产生意外反应。
在TYPE_ITEM_AMOUNTS类型中,你设置view为disabled,OnClickListener为null,所以不能点击,我想这正是你想要的;
在TYPE_ITEM_LIMITS类型中,你这里有一个Switch,但是你没有为switch设置OnCheckedChangeListener。 当您为 ListView 使用 OnItemClickListener 时,请记住 this:If 列表项中有任何可以单击的内容(按钮,或者在您的情况下为开关),然后 onItemClick() 方法永远不会 work.This 这就是为什么您的 listView 中没有任何内容是可点击的。
您应该将列表中的所有视图设置为不可聚焦,以便 onItemClick() 可以以另一种方式工作normally.Or,不要使用 OnItemClickListener,只需为您的开关设置一个 OnCheckedChangeListener 来处理点击事件。
你下面列出的代码对我来说没有意义。这会将整个布局视图设置为禁用。 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);
- 我觉得艾豪的回答也对,但是不太清楚,可能和我建议的代码冲突。