单击后如何禁用 ListView 项目?
Posted
技术标签:
【中文标题】单击后如何禁用 ListView 项目?【英文标题】:How to disable ListView item after it has been clicked? 【发布时间】:2013-03-30 22:30:41 【问题描述】:我有一个简单的Strings
数组,我在水平ListView
和ArrayAdapter
中显示。 我要做的是:当用户从ListView
中选择一个项目时,使该项目不可点击并更改该项目的背景颜色。也许就像一个“灰色”的外观。我正在考虑创建一个自定义 Adapter
并覆盖 isEnabled(int position)
方法,但我不知道该怎么做。任何建议、建议或帮助将不胜感激!
【问题讨论】:
自定义列表适配器听起来正是您所需要的 【参考方案1】:我正在考虑创建一个自定义适配器并覆盖
isEnabled(int position)
方法,但我不知道该怎么做。
这很容易做到。我推荐一个 SparseBooleanArray 来跟踪启用的项目以提高效率:
public class MyAdapter extends ArrayAdapter<String>
private SparseBooleanArray enabledItems = new SparseBooleanArray();
public MyAdapter(Context context, int textViewResourceId, List<String> objects)
super(context, textViewResourceId, objects);
@Override
public boolean areAllItemsEnabled()
return false;
@Override
public boolean isEnabled(int position)
return enabledItems.get(position, true);
public void toggleItem(int position)
boolean state = enabledItems.get(position, true);
enabledItems.put(position, !state);
Eclipse 的自动完成功能完成了这项工作,但这里有一些简短的说明:
您必须覆盖areAllItemsEnabled()
以及 isEnabled()
我设计了toggle()
供onItemClickListener()
使用,您只需调用adapter.toggle(position)
如果您想更改行的外观(比默认情况下启用和禁用所做的更多),只需覆盖getView()
。不要忘记涵盖这两种情况:
public View getView(int position, View convertView, ViewGroup parent)
convertView = super.getView(position, convertView, parent);
if(!isEnabled(position))
/* change to disabled appearance */
else
/* restore default appearance */
return convertView;
希望有帮助!
【讨论】:
【参考方案2】:单击列表项时将位置传递给适配器类
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
adapter.setSelectedIndex(position);
将setSelectedIndex的方法添加到适配器类
public void setSelectedIndex(int ind)
selectedIndex = ind;
notifyDataSetChanged();
现在检查这个列表视图的位置,如果相同,然后在 getView me 方法中启用和禁用值
if(selectedIndex!= -1 && position == selectedIndex)
holder.tv.setBackgroundColor(Color.BLACK);
else
holder.tv.setBackgroundColor(selectedColor);
holder.tv.setText("" + (position + 1) + " " + testList.get(position).getTestText());
Reference from here
【讨论】:
【参考方案3】:使用setEnabled(bool)
属性:
yourlistview.setEnabled(false);
【讨论】:
这会禁用整个 ListView 吗?因为我只需要它来禁用 ListView 中的点击项。【参考方案4】:不确定它是否会起作用
public void onItemClick(AdapterView<?> parent, View view, int position,
long id)
// your code
view.setBackgroundColor(Color.BLUE);
view.setEnabled(false);
【讨论】:
如果每一行都是一个单独的视图,这将起作用,但 ListViews 回收行以提高效率,因此它不会像您预期的那样运行。以上是关于单击后如何禁用 ListView 项目?的主要内容,如果未能解决你的问题,请参考以下文章
如何更新 ListView 的一行,将视图添加到单击的项目?