2012-08-02 15 views
21

में पहली आइटम के लिए काम नहीं कर रहा है मुझे ग्रिड व्यू-आधारित कैलेंडर बनाने में कोई समस्या है। यहाँ ग्रिड है:OnClickListener GridView

GridView Calendar

यह एक कैलेंडर की घटनाओं के साथ आबादी माना जाता है, इसलिए मैं अपने एडाप्टर लागू OnClickListener है और मैं कैलेंडर में हर बटन के लिए है कि श्रोता निर्धारित किया है। यह प्रत्येक बटन के लिए पूरी तरह से काम करता है EXCEPT पहला (इस मामले में संख्या 30)। जब मैं इसे क्लिक करता हूं तो यह काम नहीं करता है, लेकिन जब मैं पहले बटन पर क्लिक करने के बाद किसी अन्य बटन पर क्लिक करता हूं, तो यह दूसरे बटन के लिए क्लिक करने से पहले पहले के लिए क्लिक करता है।

मैंने प्रासंगिक प्रश्नों के बारे में 10 पृष्ठों को स्कैन किया है और किसी को यह समस्या नहीं मिली है। कृपया मदद करें!

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

कृपया कोड उपयोग किया है .. –

+0

[क्यों आप इस उदाहरण की कोशिश नहीं की] (http://w2davids.wordpress.com/android-simple-calendar/) – Praveenkumar

+0

मेरी कोड है कि उदाहरण के – Valentin

उत्तर

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

जब gridCell बटन instatiating डाल, किसी भी तरह, यह अनुकूलक में प्रथम स्थान के क्लिक श्रोता घुलमिल। मैंने इसे टैग द्वारा प्राप्त करने के बजाय, प्रत्येक पास में धारक को बस उत्तेजित करके इसे ठीक कर दिया (जो प्रदर्शन के लिए बेहतर है, लेकिन ओह ठीक है)। मदद के लिए सभी का धन्यवाद।

+0

क्या आप कुछ और कोड डाल सकते हैं –

+0

वास्तव में कनवर्ट व्यू का पुन: उपयोग नहीं कर रहा है यह ठीक से काम करता है –

0

GridView वस्तु पर onItemClickListener बजाय सेट में पहले एक को छोड़कर हर gridcell के लिए बुलाया जाता है:

के रूप में पूछा गया तो यहाँ मेरी कोड के getView समारोह है प्रत्येक बटन पर क्लिकलिस्ट पर सेट करने के लिए।

और मुझे आपकी समस्या here के साथ एक और प्रश्न मिला। बाउंटी शायद?

+0

पर आधारित है डाल काम नहीं करता मैं इसे करने की कोशिश की। – Valentin

+0

मैंने छवि दृश्यों के साथ बटन को बदलने की भी कोशिश की (जैसा कि मुझे पता है कि बटन ग्रिड व्यू के ITemClickListeners को अवरुद्ध करते हैं) लेकिन यह अभी भी काम नहीं करता है। – Valentin

+0

कृपया कोड जोड़ें – png

0

कृपया इसे link देखें, इसने ट्रांस्पैंटेंट के लिए ग्रिडव्यू पृष्ठभूमि रंग सेट किया है। यह आपकी मदद कर सकता है।

1

इसके लायक होने के लिए, मुझे यह समस्या भी थी (ग्रिडव्यू में पहला सेल ऑनक्लिक होने में देरी हुई थी)।

मेरे मामले में, मैं छवियों के गतिशील सेट के साथ एक (हल्के ढंग से अनुकूलित) ग्रिडव्यू का उपयोग कर रहा था जिसे मैं दृश्यमान/चला गया और ग्रिडव्यू को दोबारा हटा दूंगा। सभी छविदृश्य जहां पहले से तैयार और एडाप्टर में संग्रहीत किया गया था।

प्रारंभ में, मैंने एडाप्टर परडेटाट चेंज() को सूचित किया था, लेकिन इसके परिणामस्वरूप सेट को अपडेट होने पर पहले सेल के लिए देरी क्लिक समस्या हुई। मैं ग्रिडव्यू को अमान्य करने के लिए बदल गया और अब चीजें ठीक हैं। ध्यान रखें कि मेरे सभी विचार पहले से ही एडाप्टर में बनाए और संग्रहीत किए गए हैं, इसकी केवल समीक्षा विधि है जो जांचती है कि कौन से लोग वास्तव में दिखाई दे रहे हैं।

8

, के बाद .setAdapter() विधि अपनी गतिविधि में अपनी OnClickListener() का प्रयोग कर अपनी एडाप्टर कक्षा में नहीं।

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

धन्यवाद। मेरी समस्या आपके समाधान से हल हो गई है। –

+1

यह समाधान सर्वोत्तम है – Miguel

+0

मुझे कहना है, क्या आप मुझसे शादी करेंगे? एक आकर्षण की तरह काम करता है ... –

1

मुझे यह वही समस्या थी। पहले आइटम पर क्लिक इवेंट में काफी देरी हुई थी। मैं पहले ही सूचित कर रहा थाडेटासेट इन्वालिडेटेड()।onItemClickListener() ने को हल किया, हालांकि मुझे अभी भी समझ में नहीं आता है कि व्यक्तिगत वस्तुओं पर ऑनक्लिक श्रोता इस व्यवहार का कारण क्यों है।

13

मुझे एक ही समस्या थी। अगर (देखें == नल) खंड के अंदर सेटलेआउट पैराम्स को दबाकर काम किया गया। आपको इस तरह से दृश्य recyling बलिदान नहीं करना है।

चाहते:

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

मैं नहीं जानता कि यह क्यों काम करता है, लेकिन यह मेरे लिए काम किया। मैंने यह भी देखा कि स्टैक ओवरफ्लो में एक ही मुद्दे के बारे में सभी कोडों ने भी खंड के बाहर सेटलेआउट पैराम का उपयोग किया था। यह मेरा पहला समय है इसलिए मुझे नहीं पता कि मैं इसे हर जगह पोस्ट कर सकता हूं या नहीं। उम्मीद है कि यह मदद की।

स्रोत: बहुत सारे निशान और त्रुटि।

+2

में ऑनक्लिक लिस्टनर को कार्यान्वित करने की कोशिश करने से यह बहुत आसान है और मेरे लिए बहुत समय बचा है – 365SplendidSuns

+0

बहुत बहुत धन्यवाद! यह मदद करता है। – Zikkoua

+0

धन्यवाद आपने मुझे बहुत मदद की :) – Radwa

संबंधित मुद्दे