2010-04-01 70 views
2

我希望在这里解决的问题是,当我点击ListView中的一个项目,该项目的背景变为浅灰色,但当我继续在列表中滚动浏览列表时,每个第4项都将背景更改为浅灰色,即使其他项目未被点击。我怎样才能让我点击的物品受到点击的影响?ListView选择问题...使用onItemClick(AdapterView <?>父,查看视图,...)

ListView lv = (ListView) findViewById(R.id.resultsList); 
    lv.setAdapter(new ArrayAdapter<String>(this, R.layout.resultitem, (String[])labelList.toArray(new String[labelList.size()]))); 

    lv.setOnItemClickListener(new OnItemClickListener() {  

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
      TextView tv = (TextView)view.findViewById(R.id.result); 
      tv.setBackgroundColor(Color.LTGRAY); 
      tv.setTextColor(Color.BLACK); 
     } 
    } 

回答

1

你必须重写getView()在ListAdapter的子类,在这种情况下,ArrayAdapter。

这是因为Android实际上重复使用行来节省资源和CPU(当一行从屏幕上滚动时,它被重新用于新行进入视图)。因此,如果您将背景灰色设置为一行,则可能会最终再次使用,并且背景仍然是灰色的。

如果你是ArrayAdapter的子类,你可以让你的onItemClickListener设置某种标志,然后你的ArrayAdapter的getView(),你可以根据该标志设置合适的背景颜色。

This link

+0

感谢您的帮助! – searchMaker 2010-04-01 06:29:55

+0

这里有什么问题吗? private class LabelAdapter extends ArrayAdapter { \t private String [] items; \t public LabelAdapter(上下文环境,int textViewResourceId,String []字符串){ \t super(context,textViewResourceId,strings); \t this.items = strings; \t} \t \t @Override \t公共视图getView(INT位置,查看convertView,父的ViewGroup){ \t视图v = convertView; \t TextView tt =(TextView)v.findViewById(R.id.result); \t tt.setText(items [position]); \t return v; \t} \t} – searchMaker 2010-04-01 07:28:26

+0

所以真的没有简单的方法来阻止适配器重新使用视图? – searchMaker 2010-04-01 08:33:48

0

我假设你正在使用转换视图就这样

...public View getView(int position, View convertView, ViewGroup parent) { .... 

子类ArrayAdapter的例子,你是改变其在第4位的背景,你的观点让我们说有6行在一个页面上,因此每个页面的每一行都会变灰,因为重复使用了相同的convertView。

我不知道我解释正确,但如果您使用convertview并更改其布局,那么您应该有逻辑重新创建该布局以避免重新使用相同(缓存)的视图。