3

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

+2

自定义列表适配器的声音正是你需要的 – brendosthoughts 2013-04-08 18:10:09

回答

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的自动完成功能都必须工作,但这里有一些快速提示:

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

    希望帮助!

0

使用setEnabled(bool)属性:

yourlistview.setEnabled(false); 
+0

这是否会禁止整个ListView的?因为我只需要它在ListView中禁用单击的项目。 – chRyNaN 2013-04-08 18:21:31

+0

@AndroidStudent Yup ... – NullPointer 2013-04-08 18:24:21

2

通位置适配器类,当你在列表项点击的setSelectedIndex的

@Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
    { 
     adapter.setSelectedIndex(position); 
    } 

add方法适配器类

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

+0

及以上sam 回答也不错 – QuokMoon 2013-04-08 18:25:33

0

不知道它是否会工作或没有

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

如果每行都是一个单独的View,但ListViews会循环使用以提高效率,所以这不会像您期望的那样运行。 – Sam 2013-04-08 18:29:15

相关问题