2012-10-01 27 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” –

相关问题