Android ListView选择问题…使用onItemClick(AdapterView<;?>;父视图、视图…)

Android ListView选择问题…使用onItemClick(AdapterView<;?>;父视图、视图…),android,listview,background,textview,android-arrayadapter,Android,Listview,Background,Textview,Android Arrayadapter,我希望在这里解决的问题是,当我单击列表视图中的一个项目时,该项目的背景会变为浅灰色,但当我继续滚动列表时,每4个项目的背景都会变为浅灰色,即使没有单击其他项目。如何使我单击的项目仅受单击的影响 ListView lv = (ListView) findViewById(R.id.resultsList); lv.setAdapter(new ArrayAdapter<String>(this, R.layout.resultitem, (String[])labelL

我希望在这里解决的问题是,当我单击
列表视图中的一个项目时,该项目的背景会变为浅灰色,但当我继续滚动列表时,每4个项目的背景都会变为浅灰色,即使没有单击其他项目。如何使我单击的项目仅受单击的影响

    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);
        }
     }
ListView lv=(ListView)findViewById(R.id.resultsList);
lv.setAdapter(新的ArrayAdapter(this,R.layout.resultitem,(String[])labelList.toArray(新的String[labelList.size()]));
lv.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、int位置、长id){
TextView tv=(TextView)view.findViewById(R.id.result);
tv.setBackgroundColor(Color.LTGRAY);
tv.setTextColor(Color.BLACK);
}
}

您必须在ListAdapter的子类中重写
getView()
,在本例中为ArrayAdapter

这是因为Android实际上重用行来节省资源和CPU(当一行从屏幕上滚动下来时,它会被重新用于新出现的行)。因此,如果你将一行的背景设置为灰色,它可能会再次被使用,而背景仍然是灰色的

如果子类为ArrayAdapter,则可以让您的onItemClickListener设置某种标志,然后在ArrayAdapter的
getView()
中,可以根据标志设置适当的背景色


有一个将ArrayAdapter子类化的示例,我想您正在像这样使用convert view

...public View getView(int position, View convertView, ViewGroup parent) { ....
你在第四个位置改变背景,你的视图在一个页面上有6行,所以每个页面的每4行都会因为重复使用同一个视图而变灰


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

这里有什么问题吗?私有类LabelAdapter扩展了ArrayAdapter{private String[]项;公共LabelAdapter(Context-Context,int-textViewResourceId,String[]strings){super(Context,textViewResourceId,strings);this.items=strings;}@Override public View getView(int-position,View-convertView,ViewGroup-parent){View v=convertView;TextView tt=(TextView)v.findViewById(R.id.result);tt.setText(items[position]);返回v;}}}那么真的没有简单的方法阻止适配器重用视图了吗?