2012-10-01 28 views
0

我想在android中使用GridView創建一個Month Calendar。 這是我的代碼:(對不起,我的命名) Activity類:當調用時GridView順序發生變化notifyDataSetChanged

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_month_calendar); 

    GridView calendar = (GridView) findViewById(R.id.month_view); 
    final List<Item> items = new ArrayList<Item>(); 
    Item item; 
    for (int i = 0; i < 42; i++) { 
     item = new Item(); 
     item.setDay(String.valueOf(i + 1)); 
     items.add(item); 
    } 

    List<String> yoteis = new ArrayList<String>(); 
    yoteis.add("Go to beach"); 
    items.get(15).setYotei(yoteis); 

    final MonthCalendarAdapter adapter = new MonthCalendarAdapter(this, items); 
    calendar.setAdapter(adapter); 

    calendar.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int pos, 
       long id) { 
      Toast.makeText(MonthCalendarActivity.this, "" + pos, Toast.LENGTH_SHORT).show();  
      List<String> newYoteis = new ArrayList<String>(); 
      newYoteis.add("new yotei");    
      items.get(pos).setYotei(newYoteis); 
      adapter.notifyDataSetChanged(); 
     } 

    }); 
} 

適配器:

List<Item> items; 
Context mContext; 
public MonthCalendarAdapter(Context context, 
     List<Item> objects) { 
    super(context, 0, objects); 
    mContext = context; 
    items = objects; 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    MonthCell cell; 
    LayoutParams params = new GridView.LayoutParams(65,80); 
    if(convertView == null) { 
     cell = new MonthCell(mContext, items.get(position)); 
     cell.setLayoutParams(params); 
     cell.setScaleType(ImageView.ScaleType.CENTER_CROP); 
    }else { 
     convertView.setLayoutParams(params); 
     cell = (MonthCell) convertView; 
    } 

    return cell; 
} 

MonthCell類:

public class MonthCell extends ImageView { 

    Paint paint; 
    Item item; 
    public MonthCell(Context context) { 
     super(context); 
     paint = new Paint(); 
    } 

    public MonthCell(Context context, Item item) { 
     this(context);  
     this.item = item; 

    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     paint.setColor(Color.rgb(0, 176, 240)); 
     canvas.drawText(item.getDay(), 10, 20, paint); 

     List<String> yoteis = item.getYotei(); 
     if(yoteis != null) { 
      if(!yoteis.isEmpty()) { 
       setBackgroundResource(R.drawable.cell); 

       paint.setColor(Color.rgb(255, 124, 128)); 
       for(int i = 0; i < yoteis.size(); i++) { 
        canvas.drawText(yoteis.get(i), 10, 20 * (i + 2), paint); 
       } 
      } 
     } 
    } 
} 

第一次加載活動,屏幕是這樣的:

8 9 10 ....

但是,當我點擊日曆,的順序改變這樣的:

42 41 40 39 ....

....

(對不起,我不能上傳圖片,因爲我沒有足夠的聲望) 任何人都可以向我解釋爲什麼會發生,以及如何解決它。 在此先感謝!

回答

1

我認爲這是由於convertView的使用不正確。這種假設可以通過以下getView代碼

public View getView(int position, View convertView, ViewGroup parent) { 
    MonthCell cell; 
    LayoutParams params = new GridView.LayoutParams(65,80); 
    cell = new MonthCell(mContext, items.get(position)); 
    cell.setLayoutParams(params); 
    cell.setScaleType(ImageView.ScaleType.CENTER_CROP); 
    return cell; 
} 

你不能假設很容易地驗證了convertView當請求「位置」包含「位置」的項目順利通過。你將不得不再次正確地初始化convertView。

+0

謝謝您回答。 我用你的代碼,它工作正常。 但我不知道,在我的情況下,有沒有辦法使用convertView? –

+0

您應該使用convertView出於性能原因。但是你必須正確地初始化它。你的代碼以某種方式假設,當調用getView(position,convertView,...)時,convertView包含items.get(position)。這個假設是無效的,所以你必須重新初始化convertView並設置正確的項目。 –

+0

jaredzhang先生的建議似乎是使用convertView的理想選擇,但它仍然不能正常工作。你能建議我如何正確初始化convertView嗎? –

1

我覺得這裏的問題發生

if(convertView == null) { 
    cell = new MonthCell(mContext, items.get(position)); 
    cell.setLayoutParams(params); 
    cell.setScaleType(ImageView.ScaleType.CENTER_CROP); 
}else { 
    convertView.setLayoutParams(params); 
    cell = (MonthCell) convertView; 
} 

試圖修改這樣的:

if(convertView == null) { 
     convertView = new MonthCell(mContext, null); 
     ((MonthCell)convertView).setLayoutParams(params); 
     ((MonthCell)convertView).setScaleType(ImageView.ScaleType.CENTER_CROP); 
    } 
    ((MonthCell)convertView).setItem(items.get(position)); 
在customview

而且MonthCell你應該產生的吸氣田間item

+0

我試圖通過使用你的代碼使用convertView,順序沒有改變,但items.get(位置)似乎不正確。當我點擊一個項目時,單擊單元格,另一個單元格的背景已更改。我認爲,正如MrMarc Van Daele先生所說的那樣:「你不能假設當請求'position'時convertView包含'position'項目時傳遞的convertView」 –

相關問題