向上和向下滚动时,列表行背景随机变化

时间:2015-08-27 15:23:22

标签: android listview adapter android-cursoradapter

我有一个listview,其adaper扩展了CursorAdapter类。我可以从光标中获取数据并成功显示listview中有关tv程序的信息。我想通过查看列表中程序的开始和结束时间来标记处于活动状态的电视节目。所以我想改变活动的背景颜色。一切都是正确运行的,但是当我向下滚动列表时,其他一些行也会被标记出来。我已经研究了一些关于listview回收的文件,但我无法理解。这是我的代码:

我的适配器类:

public class StreamListAdapter extends CursorAdapter {

//............


public void bindView(View view, Context context, Cursor cursor) {
    // TODO Auto-generated method stub

    ViewHolder holder = (ViewHolder)view.getTag();

    Typeface fontStyle = Typeface.createFromAsset(context.getAssets(),"fonts/CenturyGothicItalic.ttf");

    holder.tVName.setTypeface(fontStyle);
    holder.tVBrief.setTypeface(fontStyle);
    holder.tVClock.setTypeface(fontStyle);
    holder.tVStat.setTypeface(fontStyle);
    holder.tVGenre.setTypeface(fontStyle);
    RelativeLayout rL = (RelativeLayout)view.findViewById(R.id.stream_list_item);



    String title = cursor.getString(cursor.getColumnIndex("ProgramName"));
    String brief = cursor.getString(cursor.getColumnIndex("ProgramBrief"));
    String clock = cursor.getString(cursor.getColumnIndex("ProgramClock"));
    String genre = cursor.getString(cursor.getColumnIndex("ProgramGenre"));
    String stat = cursor.getString(cursor.getColumnIndex("ProgramStat"));

    String imageURL = cursor.getString(cursor.getColumnIndex("ProgramImageUrl"));


    SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
    Date dt = new Date();
    String strValue = timeFormat.format(dt);

    String prgStartTime = clock.substring(6, 11);
    String prgEndTime = clock.substring(14);


    try {
        Date prgClockStart = timeFormat.parse(prgStartTime);
        Date systemClock = timeFormat.parse(strValue);
        Date prgClockEnd = timeFormat.parse(prgEndClock);

        if(((systemClock.compareTo(prgClockStart) > 0) || (systemClock.compareTo(prgClockStart) == 0)) & (systemClock.compareTo(prgClockEnd) < 0)){


            rL.setBackground(context.getResources().getDrawable(R.drawable.activegradient));


        }
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    holder.tVName.setText(title);
    holder.tVBrief.setText(brief);
    holder.tVClock.setText(clock);
    holder.tVStat.setText(stat);
    holder.tVGenre.setText(genre);
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    // TODO Auto-generated method stub

    View row = cursorInflater.inflate(R.layout.stream_list_item, parent, false);

    ViewHolder holder = new ViewHolder(row);
    row.setTag(holder);

    return row;


}

}

1 个答案:

答案 0 :(得分:1)

代码中写着:

if(((systemClock.compareTo(prgClockStart) > 0) || (systemClock.compareTo(prgClockStart) == 0)) & (systemClock.compareTo(prgClockEnd) < 0)){

        rL.setBackground(context.getResources().getDrawable(R.drawable.activegradient));

}

需要有像

这样的else块
else{
    rL.setBackground( // tranparent or non-active color )
}

这是因为视图被回收了。假设屏幕顶部的视图“1”滚动,如果继续滚动,该视图最终将被回收并显示在底部准备好反弹。

在游标适配器中,您有一种创建视图的方法和一种用于绑定它们的方法。如果你在代码中放入一些日志,你会发现应用程序只创建了一些视图,但是当它重复使用时会多次调用bindView。

这是因为重用视图比保留许多不在内存中使用的不同视图更有效。

简单地说 - 如果你在bindView方法中有一个“if”块,那么必须始终有一个else。永远不要认为你的观点是以空白的方式开始的。