2014-11-05 102 views
1

如何检测第二次点击listview项目的时间?检测第二次点击.setOnItemClickListener()

我已经这样做了,当点击列表视图中的项目时,颜色设置为绿色。现在我想要的是在第二次点击后改变颜色。

任何人都可以解释我可以这样做吗?

继承人在那里我设置颜色为绿色:

 listView.setOnItemClickListener(new OnItemClickListener(){ 
     @Override 
     public void onItemClick(AdapterView<?> parent, View v, int position, long id){ 

      parent.getChildAt(position).setBackgroundColor(Color.GREEN); 

     } 
    }); 
+0

当项目点击基于设置的其他背景颜色时,检查背景颜色。 – 2014-11-05 08:54:01

+0

这只是一个建议,取决于你最终想做什么,但是你可以做一些类型的计数器,然后在inItemCLick中,只是看看有多少点击已经完成,并且改变了颜色的功能。可能会有些比这更好的方式,但同时你可以向前移动 – Shudy 2014-11-05 08:55:19

回答

1

只需在您的Listener中添加一个属性变量即可。像这样:

listView.setOnItemClickListener(new OnItemClickListener(){ 
    private Set<Integer> hasClickedSet = new HashSet<Integer>(); 
    @Override 
    public void onItemClick(AdapterView<?> parent, View v, int position, long id){ 
     if (hasClickedSet.contains(position)){ 
      v.setBackgroundColor(Color.BLACK); 
     } else { 
      v.setBackgroundColor(Color.GREEN); 
      hasClickedSet.add(position); 
     } 
} 

而且您不需要调用parent.getChildAt(position)。只需使用'v'参数即可。

========编辑============ 没关系,试试这个:

listView.setOnItemClickListener(new OnItemClickListener(){ 
     private SparseArray<Boolean> hasClicked = new SparseArray<Boolean>(); 
     @Override 
     public void onItemClick(AdapterView<?> parent, View v, int position, long id){ 
      if (hasClicked.get(position, false)){ 
       v.setBackgroundColor(Color.RED); 
       hasClicked.put(position, false); 
      } else { 
       v.setBackgroundColor(Color.GREEN); 
       hasClicked.put(position, true); 
      } 
    } 
+0

这只能运行一次 – 2014-11-05 09:12:12

+0

编辑后尝试我的新代码。 – WoookLiu 2014-11-05 09:27:16

+0

工作。非常感谢 – 2014-11-05 09:43:53

2

尝试这种方式

Boolean flag=false; 

    listView.setOnItemClickListener(new OnItemClickListener(){ 
     @Override 
     public void onItemClick(AdapterView<?> parent, View v, int position, long id){ 

      if(flag==false){ 
      parent.getChildAt(position).setBackgroundColor(Color.GREEN); 
      flag=true; 
      } 
      else{ 
      parent.getChildAt(position).setBackgroundColor(Color.RED); 
      flag=false; 
      } 

     } 
    }); 
+0

非常好!我正在寻求的解决方案的类型。谢谢! – 2014-11-05 08:59:39

+0

除了我必须点击两次。那是怎么回事? – 2014-11-05 09:04:36

+0

你应该有不止一个国旗。使用SparseArray存储每个项目视图的标志。 – WoookLiu 2014-11-05 09:06:33

0

您可以跟踪点击

 int count = 0; // define globally 
    view.clickListener(){ 
     count++; 
     if (count==1) 
      { 
       // first click 
      } 
     else{ 
       // not first click 
       } 
    } 
0

的n个试试这个办法,希望这将帮助你解决你的问题。

采取的HashMap持有的所有位置和布尔的就是点击与否:

HashMap<Integer,Boolean> clickMap = new HashMap<Integer, Boolean>(); 

检查HashMap中包含这个位置意味着这个位置的项目点击在HashMap中的变化的背景基地以及布尔值:

if(clickMap.containsKey(position) && clickMap.get(position)){ 
    parent.getChildAt(position).setBackgroundColor(Color.orignal); 
    clickMap.put(position,false); 
}else{ 
    clickMap.put(position,true); 
    parent.getChildAt(position).setBackgroundColor(Color.GREEN); 
} 
5

如果你正试图从你的电池它不修改任何会为第二次点击工作。 为此,请尝试使适配器内部的侦听器,然后更改背景的颜色(convertView.setBackground(*))。对我来说,它的工作如下图所示:

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    convertView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     if (viewHolder.addedButton.getVisibility() == View.INVISIBLE) { 
     viewHolder.addedButton.setVisibility(View.VISIBLE); 
     convertView.setBackground(any_color_you_want); 
     listener.onButtonAdd(v, position); 
     } else { 
     viewHolder.addedButton.setVisibility(View.INVISIBLE); 
     convertView.setBackground(any_color_you_want); 
     listener.onButtonRemove(v, position); 
     } 
    } 
    }); 

} 

在这个例子中,我试图做一个可检查的列表。