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

我有一个简单的Strings 数组,我在水平ListViewArrayAdapter 中显示。 我要做的是:当用户从ListView 中选择一个项目时,使该项目不可点击并更改该项目的背景颜色。也许就像一个“灰色”的外观。我正在考虑创建一个自定义 Adapter 并覆盖 isEnabled(int position) 方法,但我不知道该怎么做。任何建议、建议或帮助将不胜感激!

【问题讨论】:

  • 自定义列表适配器听起来正是您所需要的

标签: java android listview android-listview android-arrayadapter


【解决方案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 回收行以提高效率,因此它不会像您预期的那样运行。
      猜你喜欢
      • 2017-08-06
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      相关资源
      最近更新 更多