单击后如何禁用 ListView 项目?

Posted

技术标签:

【中文标题】单击后如何禁用 ListView 项目?【英文标题】:How to disable ListView item after it has been clicked? 【发布时间】:2013-03-30 22:30:41 【问题描述】:

我有一个简单的Strings 数组,我在水平ListViewArrayAdapter 中显示。 我要做的是:当用户从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 项目?的主要内容,如果未能解决你的问题,请参考以下文章

禁用 Android ListView 项目上的点击事件

禁用 ListView 项目单击然后启用它

Xamarin Forms ListView 元素被禁用

如何更新 ListView 的一行,将视图添加到单击的项目?

单击 ListView 上的删除按钮后删除 ListView 上的项目

listView.setOnItemClickListener 标头项禁用