我想在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 ....
....
(對不起,我不能上傳圖片,因爲我沒有足夠的聲望) 任何人都可以向我解釋爲什麼會發生,以及如何解決它。 在此先感謝!
謝謝您回答。 我用你的代碼,它工作正常。 但我不知道,在我的情況下,有沒有辦法使用convertView? –
您應該使用convertView出於性能原因。但是你必須正確地初始化它。你的代碼以某種方式假設,當調用getView(position,convertView,...)時,convertView包含items.get(position)。這個假設是無效的,所以你必須重新初始化convertView並設置正確的項目。 –
jaredzhang先生的建議似乎是使用convertView的理想選擇,但它仍然不能正常工作。你能建議我如何正確初始化convertView嗎? –