2012-08-02 19 views
21

我在創建基於GridView的日曆時遇到了問題。這裏是網格:OnClickListener不適用於GridView中的第一項

GridView Calendar

這應該是填充事件日曆,所以我有我的適配器實現OnClickListener和我設置監聽器在日曆每個按鈕。它適用於每個按鈕除了第一個(在這種情況下編號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被調用每一個柵格單元除了在左上角

+0

請把你使用的代碼.. – 2012-08-06 07:46:55

+0

[你爲什麼不試試這個例子](http://w2davids.wordpress.com/android-simple-calendar/) – Praveenkumar 2012-08-06 09:08:40

+0

我的代碼是基於那個例子 – Valentin 2012-08-06 11:50:44

回答

8

好的,我找到了解決方案。問題是這些行:

ViewHolder holder; 
if (convertView == null) 
{ 
    holder = new ViewHolder(); 
    LayoutInflater inflater = (LayoutInflater) _context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    convertView = inflater.inflate(R.layout.calendar_day_gridcell, parent, false); 
    holder.gridCell = (Button) convertView.findViewById(R.id.calendar_day_gridcell_button); 
    holder.multiDayEvent = (EventLengthView) convertView.findViewById(R.id.eventLengthView); 
    convertView.setTag(holder); 
} 
else { 
    holder = (ViewHolder) convertView.getTag(); 
} 

當把instatiating的柵格單元按鈕那裏,不知何故,它混合了適配器中的第一位置的點擊收聽。我最終通過每次傳遞持有者來安裝它,而不是通過標籤獲得它(這對性能更好,但是很好)。感謝大家的幫助。

+0

可以ü放一些代碼 – 2013-10-05 06:08:46

+0

真的不重複使用convertView使這個工作正常 – 2015-04-17 16:13:36

0

設置onItemClickListener GridView的對象上,而不是第一個在每個按鈕上設置onClickListeners。

我發現你的問題here的另一個問題。賞金也許?

+0

不起作用。我嘗試過這個。 – Valentin 2012-08-02 13:47:29

+0

我也嘗試用ImageViews替換按鈕(因爲我知道按鈕阻止GridView的onItemClickListeners),但它仍然無法使用。 – Valentin 2012-08-02 14:17:13

+0

請添加代碼 – png 2012-08-06 08:19:11

0

請參考這個link,它已經爲TRANSPARENT設置了gridview背景色。它可能會幫助你。

1

爲什麼它的價值,我也有這個問題(gridview中的第一個單元格延遲onclick)。

在我的情況下,我使用了一個(輕度定製的)gridviews與動態圖像集,我會使可見/消失和重繪gridview。所有的圖像預先準備好並存儲在適配器中。

最初,我在適配器上使用了notifyDataSetChanged(),但是這會導致第一個單元的延遲點擊問題,無論何時更新集合。我改變了只是使gridview無效,現在事情都很好。請記住,我的所有視圖都已創建並存儲在適配器中,它只是getview方法,用於檢查哪些視圖確實可見。

8

使用您OnClickListener()在活動後.setAdapter()方法,而不是在你的適配器類。

gridView.setAdapter(adapter); 
gridView.setOnItemClickListener(new OnItemClickListener() { 
public void onItemClick(AdapterView parent, View v, int position, long id) { 
    Toast.makeText(GridViewActivity.this, "" + position, 
      Toast.LENGTH_SHORT).show(); 
    } 
}); 
+1

謝謝。我的問題已經由您的解決方案解決。 – 2014-03-02 10:10:27

+1

此解決方案最好 – Miguel 2014-05-24 16:10:40

+0

讓我說,你願意嫁給我嗎?工作就像一個魅力... – 2015-12-28 11:33:55

1

我有同樣的問題。第一個項目上的點擊事件顯着延遲。我已經在使用notifyDataSetInvalidated()。使用onItemClickListener()解決了問題,但我仍然不明白爲什麼單個項目上的onClick偵聽器具有此行爲。

13

我有同樣的問題。在if(view == null)子句內部注意setLayoutParams。您不必以這種方式犧牲視圖回收。

喜歡:

if(row == null){ 
    // inflate row 
    row.setLayoutParams(params); 
    //remaining code 
}else{ 
    holder = (ViewHolder)row.getTag(); 
} 
// everything else 

我不知道爲什麼它的工作原理,但它爲我工作。我還注意到,關於在stackoverflow中的相同問題的所有代碼也使用了if語句之外的setLayoutParams。這是我第一次,所以我不知道我是否可以在任何地方發佈。希望它有幫助。

來源:很多的蹤跡和錯誤。

+2

爲我工作,節省了我很多時間 – 365SplendidSuns 2015-11-08 07:32:55

+0

非常感謝!它有助於。 – Zikkoua 2015-12-24 11:10:12

+0

謝謝你幫了我很多:) – Radwa 2017-03-29 10:44:59

相關問題