2012-01-02 89 views
0

我在我的Activity和自定义SimpleCursorAdapter中有ListView。 自定义SimpleCursorAdapter看起来像这样。自定义SimpleCursorAdapter错误

public class MySimpleCursorAdapter extends SimpleCursorAdapter { 

    private Activity activity; 
    private Cursor cursor; 

public MySimpleCursorAdapter(Context context, int layout, Cursor c, 
String[] from, int[] to, Activity activity) { 

    super(context, layout, c, from, to); 
    this.activity = activity; 
    this.cursor = c; 
} 

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

    View view = convertView; 
    if (view == null) 
    view = View.inflate(this.activity, 
     com.tour.R.layout.third_level_list_item, null); 

    cursor.moveToPosition(position); 

String hotelName=cursor.getString(cursor.getColumnIndexOrThrow(TodoDbAdapter.KEY_HOTEL)); 
String stars = cursor.getString(cursor.getColumnIndexOrThrow(TodoDbAdapter.KEY_ROW_STARS)); 
int numberOfStars = Integer.parseInt(stars); 

TextView hotel = (TextView) view.findViewById(com.tour.R.id.hotel); 
    if (hotel != null) 
     hotel.setText(hotelName); 

    ImageView[] images = new ImageView[5]; 
    images[0] = (ImageView) view.findViewById(com.tour.R.id.slika1); 
    images[1] = (ImageView) view.findViewById(com.tour.R.id.slika2); 
    images[2] = (ImageView) view.findViewById(com.tour.R.id.slika3); 
    images[3] = (ImageView) view.findViewById(com.tour.R.id.slika4); 
    images[4] = (ImageView) view.findViewById(com.tour.R.id.slika5); 

    for (int i = 0; i < numberOfStars; i++) 
     images[i].setVisibility(View.VISIBLE); 

    return view; 

} 

}

CustomSimpleCursor适配器设置好的如列表适配器。

代码效果很好,酒店名称还可以,星星也可以,但问题是滚动列表一段时间后,每个酒店都会获得5颗星,而且我知道这是真的。

任何帮助如何管理从该数据库列表视图中的星星数量。 谢谢。

回答

1

我想你只需要确保你清理你的状态。 您的适配器会在您的数据显示星星时显示恒星。然而,当它们不是时,它们永远不会让它们走向/不可见。

ImageView[] images = new ImageView[5]; 
    images[0] = (ImageView) view.findViewById(com.tour.R.id.slika1); 
    images[1] = (ImageView) view.findViewById(com.tour.R.id.slika2); 
    images[2] = (ImageView) view.findViewById(com.tour.R.id.slika3); 
    images[3] = (ImageView) view.findViewById(com.tour.R.id.slika4); 
    images[4] = (ImageView) view.findViewById(com.tour.R.id.slika5); 

    for (ImageView image : images) { 
     image.setVisibility(View.INVISIBLE); 
    } 

    for (int i = 0; i < numberOfStars; i++) 
     images[i].setVisibility(View.VISIBLE); 

此外,如果你愿意,你可以缓存一些ImageView的阵列,以避免穿越每次结合的细胞时树的查找成本。像:

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

    View view = convertView; 
    if (view == null) { 
     view = View.inflate(this.activity, com.tour.R.layout.third_level_list_item, null); 
     ImageView[] images = new ImageView[5]; 
     images[0] = (ImageView) view.findViewById(com.tour.R.id.slika1); 
     images[1] = (ImageView) view.findViewById(com.tour.R.id.slika2); 
     images[2] = (ImageView) view.findViewById(com.tour.R.id.slika3); 
     images[3] = (ImageView) view.findViewById(com.tour.R.id.slika4); 
     images[4] = (ImageView) view.findViewById(com.tour.R.id.slika5); 
     view.setTag(images); 
    } 

    ImageView[] images = (ImageView[]) view.getTag(); 
    for (ImageView image : images) { 
     image.setVisibility(View.INVISIBLE); 
    } 

    for (int i = 0; i < numberOfStars; i++) 
     images[i].setVisibility(View.VISIBLE); 

    return view; 
} 
+0

感谢的人......它的工作原理... :) – Markonato 2012-01-02 20:52:41

0

你永远不会让星星看不见。它应该是这样的:

for (int i = 0; i < numberOfStars; i++) 
    images[i].setVisibility(View.VISIBLE); 

for (int i = numberOfStars; i < 5; i++) 
    images[i].setVisibility(View.INVISIBLE); 

之所以这么说:

  • 考虑使用RatingBar而不是单个恒星
  • 考虑使用支架模式避免这样做的每一行上所有的findViewById()电话
  • 考虑拨打getInt()而不是getString(),然后自己将其转换为int
  • 由于这是一个CursorAdapter,理想情况下,你应该重写newView()bindView(),不getView()