0

AndroidでGridViewを使用して月間カレンダーを作成したいと考えています。これが私のコードです:(私の命名で申し訳ありません)Activityクラス:

@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);
                }
            }
        }
    }   
}

初めてアクティビティがロードされたとき、画面は次のようになります。

1 2 3 4 5 6 7

8 9 10 ....

しかし、カレンダーをクリックすると、次のように順序が変更されました。

42 41 40 39 ....

....

7 6 5 4 3 2 1

(申し訳ありませんが、評判が十分でないため、画像をアップロードできません)なぜそれが起こったのか、それを解決する方法を誰かに説明してもらえますか. 前もって感謝します!

4

2 に答える 2

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));

また、カスタムビューMonthCellで、フィールドのゲッターを生成する必要がありますitem

于 2012-10-01T09:41:03.447 に答える
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 を再度正しく初期化する必要があります。

于 2012-10-01T08:48:35.757 に答える