我被我的Android应用程序困扰了。用户界面无法正常工作。 我知道原因,但我找不到解决方案:
我有一个使用自定义适配器填充的列表视图。每行的背景颜色为白色。 当用户第一次点击一个项目时,我想将其背景颜色更改为绿色。该应用程序执行此操作,但当该行从屏幕上消失并返回时,它会丢失绿色。
当用户第二次点击时,我希望所选行的背景更改为红色,但我遇到同样的问题。
经过研究,我知道android正在重用视图以提高性能,但在我的情况下,我想保留这些更改。
我阅读了ViewHolder,notifyDataSetChanged(),view.invalidate,覆盖了getItemViewType方法,但这些都不适用于我。 (我想我做错了什么)
你可以帮我一把吗?这是我的LineAdapter类的getView方法:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
try {
Station item = getItem(position);
View v = null;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(layoutResourceId, null);
} else {
v = convertView;
}
TextView stationName = (TextView) v.findViewById(R.id.stationName);
stationName.setText(item.getStationName());
v.setBackgroundColor(Color.WHITE);
ImageView line_image = (ImageView) v.findViewById(R.id.line);
line_image.setBackgroundColor(Color.parseColor(setLineColor(line.getLineName())));
line_image.setImageResource(R.drawable.ic_line_simple);
return v;
} catch (Exception ex) {
Log.e(LOG_TAG, "error", ex);
return null;
}
}
这是我的setOnItemClickListener:
lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
station = (Station)parent.getItemAtPosition(position);
if (head ==-1) { //first click
head = position;
view.setBackgroundColor(Color.GREEN);
}
else if (terminal ==-1){ //second click
terminal = position;
view.setBackgroundColor(Color.RED);
}
}
答案 0 :(得分:1)
在getView
方法中,您必须检查该行是否已被点击,因此您的代码应该是这样的:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
try {
Station item = getItem(position);
View v = null;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(layoutResourceId, null);
} else {
v = convertView;
}
TextView stationName = (TextView) v.findViewById(R.id.stationName);
stationName.setText(item.getStationName());
if (head == position) { //first click
v.setBackgroundColor(Color.GREEN);
} else if (terminal == position){ //second click
terminal = position;
v.setBackgroundColor(Color.RED);
} else {
v.setBackgroundColor(Color.WHITE);
}
ImageView line_image = (ImageView) v.findViewById(R.id.line);
line_image.setBackgroundColor(Color.parseColor(setLineColor(line.getLineName())));
line_image.setImageResource(R.drawable.ic_line_simple);
return v;
} catch (Exception ex) {
Log.e(LOG_TAG, "error", ex);
return null;
}
}
setOnItemClickListener
的代码:
lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
station = (Station)parent.getItemAtPosition(position);
if (head ==-1) { //first click
head = position;
myAdapter.setHead(head);
view.setBackgroundColor(Color.GREEN);
}
else if (terminal ==-1){ //second click
terminal = position;
myAdapter.setTerminal(terminal);
view.setBackgroundColor(Color.RED);
}
}
此行为的原因是当行消失并返回时,将再次调用getView
方法。因此,在getView
方法中,您必须考虑行的状态。因此,您需要适配器中的状态变量head
和terminal
。