我在创建基于 GridView 的日历时遇到问题。这是网格:
这应该是一个填充了事件的日历,因此我让我的适配器实现 OnClickListener,并为日历中的每个按钮设置该侦听器。它适用于每个按钮EXCEPT第一个(在本例中为 30)。当我单击它时,它不起作用,但是当我尝试单击第一个按钮后单击另一个按钮时,它会在单击另一个按钮之前执行第一个按钮的单击。
我扫描了大约10页的相关问题,没有发现有人有这个问题。请帮助!
正如所问,这是我的代码的 getView 函数:
public View getView(int position, View convertView, ViewGroup parent)
{
View row = convertView;
ViewHolder holder;
if (row == null)
{
holder = new ViewHolder();
LayoutInflater inflater = (LayoutInflater) _context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.calendar_day_gridcell, parent, false);
holder.gridCell = (Button) row.findViewById(R.id.calendar_day_gridcell);
holder.multiDayEvent = (EventLengthView)row.findViewById(R.id.eventLengthView);
}
else{
holder = (ViewHolder)row.getTag();
}
int calendarGridHeight = (calendarView.getHeight()-5)/(getCount()/7);
AbsListView.LayoutParams params = new AbsListView.LayoutParams(
android.view.ViewGroup.LayoutParams.FILL_PARENT,
calendarGridHeight);
row.setLayoutParams(params);
//Change the background drawable depending on the position in the calendar
if ((position+1) % 7 == 0){
holder.gridCell.setBackgroundDrawable(getResources().getDrawable(R.drawable.calendar_button_selector_end_row));
}
if (getCount() - position < 8){
holder.gridCell.setBackgroundDrawable(getResources().getDrawable(R.drawable.calendar_button_selector_end_column));
}
if (position == getCount()-1){
holder.gridCell.setBackgroundDrawable(getResources().getDrawable(R.drawable.calendar_button_selector_end));
}
holder.gridCell.setOnClickListener(this);
holder.gridCell.setTag(null);//clear tags
// ACCOUNT FOR SPACING
String[] day_color = list.get(position).split("-");
int theday = Integer.parseInt(day_color[0]);
int themonth = Integer.parseInt(day_color[2]);
int theyear = Integer.parseInt(day_color[3]);
String date = DateFormat.format("dd/M/yy", new Date(theyear,themonth,theday)).toString();
if ((!eventsMap.isEmpty()) && (eventsMap != null))
{
if (eventsMap.containsKey(date))
{
holder.multiDayEvent.SetMeasure(calendarView.getWidth()/7, calendarGridHeight);
holder.multiDayEvent.setVisibility(View.VISIBLE);
//holder.singleDayEvent.setVisibility(View.VISIBLE);
Event event = (Event) eventsMap.get(date);
holder.multiDayEvent.AddEvent(event);
holder.gridCell.setTag(event);
}
else{
//holder.singleDayEvent.setVisibility(View.GONE);
holder.multiDayEvent.setVisibility(View.GONE);
}
}
// Set the Day GridCell
holder.gridCell.setText(Integer.toString(theday));
if (day_color[1].equals("GREY"))
{
holder.gridCell.setTextColor(Color.GRAY);
}
if (day_color[1].equals("WHITE"))
{
holder.gridCell.setTextColor(Color.WHITE);
}
if (day_color[1].equals("BLUE"))
{
holder.gridCell.setTextColor(Color.BLUE);
}
row.setTag(holder);
return row;
}
public class ViewHolder{
Button gridCell;
ImageView singleDayEvent;
EventLengthView multiDayEvent;
}
public void onClick(View view)
{
if (view.getTag() != null){
Event event = (Event)view.getTag();
eventListView.setAdapter(new EventListAdapter(CalendarScreen.this, event));
eventListViewLayout.setVisibility(View.VISIBLE);
eventListViewLayout.startAnimation(fadeIn);
}
else if (eventListViewLayout.getVisibility() == View.VISIBLE){
onBackPressed();
}
}
除左上角的第一个网格单元外,每个网格单元都会调用 onClick
我遇到了同样的问题。将 setLayoutParams 保留在 if(view == null) 子句中可以解决问题。您不必以这种方式牺牲视图回收。
like :
if(row == null){
// inflate row
row.setLayoutParams(params);
//remaining code
}else{
holder = (ViewHolder)row.getTag();
}
// everything else
我不知道为什么它有效,但它对我有用。我还注意到 stackoverflow 中有关同一问题的所有代码也在 if 子句之外使用了 setLayoutParams 。这是我第一次,所以我不知道是否可以将其发布到任何地方。希望有帮助。
资料来源:大量的试验和错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)