ListView重用视图,滚动后丢失信息

时间:2014-11-23 08:50:28

标签: android listview user-interface android-listview view

我被我的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); 
         }
         }

1 个答案:

答案 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方法中,您必须考虑行的状态。因此,您需要适配器中的状态变量headterminal