2012-01-02 83 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()