我想在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吗? –