2011-11-10 13 views
7

मेरी पंक्तियों में एक बटन होता है जिसमें मेरे एडाप्टर के getView में अपना स्वयं का क्लिक श्रोता सेट होता है। मैं पंक्ति के माता-पिता में एंड्रॉइड: descendantFocusability = "blockDescendants" का उपयोग करके अपने बटन क्लिक और वास्तविक पंक्ति आइटम क्लिक के बीच अंतर करने में सक्षम हूं।एंड्रॉइड: ListView पंक्ति में बदलें बटन पृष्ठभूमि ऑनक्लिक

जब मैं एक बटन पर क्लिक करता हूं तो यह बटन पृष्ठभूमि को ठीक से सेट करता है, मेरी समस्या यह है कि मैं सूची के माध्यम से स्क्रॉल करता हूं और इसे विभिन्न पंक्तियों के लिए भी सेट करता हूं। मैं विचारों को रीसाइक्लिंग के साथ कहीं भी एक मुद्दा मानता हूं।

@Override 
public View getView(int position, View convertView, ViewGroup parent){ 

    if(convertView == null){ 

     holder = new ViewHolder(); 

     convertView = inflater.inflate(R.layout.todays_sales_favorite_row, null); 
     holder.favCatBtn = (Button)convertView.findViewById(R.id.favCatBtn);    

     convertView.setTag(holder); 

    } else { 
     holder = (ViewHolder)convertView.getTag(); 
    } 

     holder.favCatBtn.setTag(position); 
     holder.favCatBtn.setOnClickListener(this); 

    return convertView; 
} 

@Override 
public void onClick(View v) { 
    int pos = (Integer) v.getTag(); 
    Log.d(TAG, "Button row pos click: " + pos); 
    RelativeLayout rl = (RelativeLayout)v.getParent(); 
    holder.favCatBtn = (Button)rl.getChildAt(0); 
    holder.favCatBtn.setBackgroundResource(R.drawable.icon_yellow_star_large); 

} 

तो अगर मैं एकदम सही ढंग से पंक्ति स्थिति 1 बटन पृष्ठभूमि परिवर्तन पर बटन पर क्लिक करें:

यहाँ मेरी कोड है। लेकिन जब मैं सूची को नीचे स्क्रॉल करता हूं तो यादृच्छिक अन्य बटन भी सेट हो रहे हैं। फिर कभी-कभी जब मैं स्थिति 1 पर वापस स्क्रॉल करता हूं तो बटन पृष्ठभूमि फिर से मूल पर वापस आती है।

मुझे यहां क्या याद आ रही है? मुझे पता है कि मैं वहीं कुछ मामूली हूं जो मैं नहीं कर रहा हूं।

+0

जब आप if (true || convertView == null) {... (तो यह हमेशा फुलाया जाता है) में बदल जाता है, तो क्या यह ठीक काम करता है? कोई समाधान नहीं, सिर्फ यह जानना है कि समस्या तब प्रकट नहीं होती है या नहीं। –

+0

हाँ जो पृष्ठभूमि को अन्य यादृच्छिक पंक्तियों में बदलने से रोकता है। स्पष्ट रूप से आपके जैसा समाधान नहीं कहा गया है, लेकिन हाँ जब तक मैं बैक अप नहीं करता तब तक यह समस्या को रोकता है और बटन वापस अपनी मूल पृष्ठभूमि में वापस आ जाता है। – askilondz

उत्तर

8

हाँ, आप सही हैं, विचार पुनर्नवीनीकरण कर रहे हैं। आपको ट्रैक करना होगा कि कौन से पदों पर क्लिक किया गया है और आपके getView विधि में पृष्ठभूमि संसाधन अपडेट करें।

private final boolean[] mHighlightedPositions = new boolean[NUM_OF_ITEMS]; 

@Override 
public View getView(int position, View convertView, ViewGroup parent){ 

    if(convertView == null){ 
     holder = new ViewHolder(); 
     convertView = inflater.inflate(R.layout.todays_sales_favorite_row, null); 
     holder.favCatBtn = (Button)convertView.findViewById(R.id.favCatBtn); 
     holder.favCatBtn.setOnClickListener(this); 
     convertView.setTag(holder); 
    }else { 
     holder = (ViewHolder)convertView.getTag(); 
    } 

    holder.favCatBtn.setTag(position); 

    if(mHighlightedPositions[position]) { 
     holder.favCatBtn.setBackgroundResource(R.drawable.icon_yellow_star_large); 
    }else { 
     holder.favCatBtn.setBackgroundResource(0); 
    } 

    return convertView; 
} 

@Override 
public void onClick(View view) { 
    int position = (Integer)view.getTag(); 
    Log.d(TAG, "Button row pos click: " + position); 

    // Toggle background resource 
    RelativeLayout layout = (RelativeLayout)view.getParent(); 
    Button button = (Button)layout.getChildAt(0); 
    if(mHighlightedPositions[position]) { 
     button.setBackgroundResource(0); 
     mHighlightedPositions[position] = false; 
    }else { 
     button.setBackgroundResource(R.drawable.icon_yellow_star_large); 
     mHighlightedPositions[position] = true; 
    } 
} 
+0

बिल्कुल सही धन्यवाद! मुझे बस सेटबैकग्राउंड रिसोर्स (0) में 0 को अन्य ड्रॉइंग में बदलना पड़ा और सबकुछ इरादे के अनुसार काम करता था। अनेक अनेक धन्यवाद! – askilondz

+0

@Chase कृपया मेरी मदद करें http://stackoverflow.com/questions/17482001/change-imageview-backgroundresource-in-listview-onitemselected-android – yakusha

+0

दोस्त, आप मेरी जान बचाते हैं – Harry

-1
holder.btnUnLock.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
// TODO Auto-generated method stub 
// Button btn = Button(v); 
    holder = (ViewHolder) v.getTag(); 
    holder.btnSetLock.setBackgroundResource(R.drawable.btn_lock_bg_right); 
holder.btnUnLock.setBackgroundResource(R.drawable.btn_unlock_bg_left); 

} 
}); 
+0

क्या आप एक स्पष्टीकरण भी जोड़ सकते हैं? – Robert

1

मैं इस StateListDrawable प्रयोग करने के लिए एक सही कम और स्वच्छ समाधान: उदाहरण के लिए, मैं पृष्ठभूमि टॉगल जोड़ने के लिए अपने कोड बढ़ाया

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    currentPosition = position; 
    holder = null; 
    if (convertView == null) { 
     holder = new Holder(); 
     LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = vi.inflate(R.layout.grid_item, null); 
     holder.imageView = (ImageView) convertView.findViewById(R.id.gridItemBtn); 

     StateListDrawable states = new StateListDrawable(); 
     states.addState(new int[] {android.R.attr.state_pressed}, 
       ContextCompat.getDrawable(context, R.drawable.pressed_state)); 
     states.addState(new int[] {android.R.attr.state_focused}, 
       ContextCompat.getDrawable(context, R.drawable.focused_state)); 
     states.addState(new int[]{}, 
       ContextCompat.getDrawable(context, R.drawable.default_state)); 
     holder.imageView.setImageDrawable(states); 
    } 

    return convertView; 
} 

यह एक साथ अभी भी सही काम करता है OnClickListener साथ जहां आप अपनी महत्वपूर्ण चीजें कर सकते हैं।

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

  • कोई संबंधित समस्या नहीं^_^