单击后如何禁用ListView项?

时间:2013-04-08 18:08:08

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

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

4 个答案:

答案 0 :(得分:9)

  

我正在考虑创建自定义适配器并覆盖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的AutoComplete功能必须完成,但这里有一些快速说明:

  • 您必须覆盖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;
    }
    

    希望有所帮助!

答案 1 :(得分: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

答案 2 :(得分:0)

使用setEnabled(bool)属性:

yourlistview.setEnabled(false);

答案 3 :(得分:0)

不确定它是否有效

    public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
                // your code
                view.setBackgroundColor(Color.BLUE);
                view.setEnabled(false);
    }