3

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

4

4 回答 4

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;
    }
    

    希望有帮助!

于 2013-04-08T18:22:36.220 回答
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());

从这里参考

于 2013-04-08T18:24:17.370 回答
0

使用setEnabled(bool)属性:

yourlistview.setEnabled(false);
于 2013-04-08T18:13:54.657 回答
0

不确定它是否会起作用

    public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
                // your code
                view.setBackgroundColor(Color.BLUE);
                view.setEnabled(false);
    }
于 2013-04-08T18:27:09.477 回答