2012-08-19 28 views
5

दोहराता है मैं एक कस्टम अनुकूलक:एंड्रॉयड कस्टम ListView चयन पृष्ठभूमि

public class PhraseCustomAdapter extends BaseAdapter 
{ 
public String original[]; 
public String translation[]; 
public String transcription[]; 

public Activity context; 
public LayoutInflater inflater; 

public PhraseCustomAdapter(Activity context,String[] original, String[] translation, String[] transcription) { 
    super(); 

    this.context = context; 
    this.original = original; 
    this.translation = translation; 
    this.transcription = transcription; 

    inflater = LayoutInflater.from(context); 
    this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return original.length; 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

public String getItemTranlation(int position) { 

    return translation[position]; 
} 

public String getItemTranscription(int position) { 
    // TODO Auto-generated method stub 
    return transcription[position]; 
} 

public String getItemOriginal(int position) { 
    // TODO Auto-generated method stub 
    return original[position]; 
} 


@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

static class ViewHolder 
{ 
    ImageView imgViewLogo; 
    TextView txtViewOriginal; 
    TextView txtViewTranslation; 
    TextView txtViewTranscription; 
} 

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

    ViewHolder holder; 
    if (convertView == null) { 
     holder = new ViewHolder(); 
     convertView = inflater.inflate(R.layout.phrase_row, null); 

     holder.imgViewLogo = (ImageView) convertView.findViewById(R.id.imgViewLogo); 
     holder.txtViewOriginal = (TextView) convertView.findViewById(R.id.txtViewOriginal); 
     holder.txtViewTranslation = (TextView) convertView.findViewById(R.id.txtViewTranslation); 
     holder.txtViewTranscription = (TextView) convertView.findViewById(R.id.txtViewTranscription); 

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


    holder.txtViewOriginal.setText(original[position]); 
    holder.txtViewTranslation.setText(translation[position]); 
    holder.txtViewTranscription.setText(transcription[position]); 

    return convertView; 
} 

}

और मैं Android4 शैली बहु चयन लागू करने की आवश्यकता (देर तक दबा है, तो आइटम का चयन करने क्लिक करें)। तो:

lview1 = (ListView) findViewById(R.id.listViewPhrase); 
    adapter = new PhraseCustomAdapter(this, original, translation, transcription); 
    lview1.setAdapter(adapter); 
    lview1.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
    lview1.setMultiChoiceModeListener(new MultiChoiceModeListener() { 

     @Override 
     public void onItemCheckedStateChanged(ActionMode mode, int position, 
               long id, boolean checked) { 
      View view; 
      if (checked){ 
       Log.v ("checked?", "YES"); 
       Log.v ("Position", Integer.toString(position)); 

       view = lview1.getChildAt(position); 
       view.setBackgroundColor(Color.LTGRAY); 


       original_list.add (adapter.getItemOriginal(position)); 
       translation_list.add (adapter.getItemTranlation(position)); 
       transcription_list.add (adapter.getItemTranscription(position)); 

       countSelected += 1; 
      } 
      if (!checked){ 
       Log.v ("checked?", "NO"); 
       Log.v ("Position", Integer.toString(position)); 


       for (int i = 0; i < original_list.size(); i++) 
       { 
        if (original_list.get(i) == adapter.getItemOriginal(position)){ 
         original_list.remove (i); 
         translation_list.remove (i); 
         transcription_list.remove (i); 
        } 
       } 
       countSelected -= 1; 
      } 


      mode.setTitle(Integer.toString(countSelected) + " " + getString(R.string.selectItem)); 
     } 

समस्या है: जब मैं देर तक दबा आइटम (उदाहरण के लिए, पहला आइटम), 7 आइटम भी (पृष्ठभूमि बदलकर) पर प्रकाश डाला गया है। जब मैं 7 वें आइटम को हाइलाइट करने के लिए "अनहेलाइट" करने का प्रयास करता हूं, तो ऐप क्रैश हो जाता है। यदि मैं नवीनतम आइटम पर क्लिक करने का प्रयास करता हूं, तो ऐप क्रैश हो जाता है। मैं कैसे देखें गाया और आइटम रीसायकल है के बारे में कुछ लेख पढ़ा है, लेकिन मैं अपनी समस्या के लिए किसी भी संभव समाधान

युपीडी पता नहीं है:

V/checked?(24966): YES 
V/Position(24966): 7 
Shutting down VM 
threadid=1: thread exiting with uncaught exception (group=0x2b542210) 
AndroidRuntime(24966): FATAL EXCEPTION: main 
java.lang.NullPointerException 
at com.alextee.phrases.PhraseActivity$1.onItemCheckedStateChanged(PhraseActivity.java:145) 
at android.widget.AbsListView$MultiChoiceModeWrapper.onItemCheckedStateChanged(AbsListView.java:5688) 
at android.widget.AbsListView.performItemClick(AbsListView.java:1040) 
at android.widget.AbsListView$PerformClick.run(AbsListView.java:2522) 
at android.widget.AbsListView$1.run(AbsListView.java:3183) 
at android.os.Handler.handleCallback(Handler.java:605) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
android.app.ActivityThread.main(ActivityThread.java:4441) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
at dalvik.system.NativeStart.main(Native Method) 
+0

आप पोस्ट कर सकते हैं जब की LogCat स्टैकट्रेस जब आप 7 वें आइटम को हाइलाइट करते हैं तो आपका ऐप दुर्घटनाग्रस्त हो जाता है? – tolgap

+0

पोस्ट के अंत में जोड़ा गया। –

उत्तर

10

सूची दृश्य स्वयं जटिल है और यह रीसाइक्लिंग भी है। यदि आप सूची दृश्य के लिए एंड्रॉइड डेवलपर वीडियो देखते हैं तो आप सूची दृश्य रीसाइक्लिंग और इसके मुद्दों के बारे में और जानेंगे।
आपके ऐप में समस्या सूची रीसाइक्लिंग के कारण है।
जब आप किसी सूची आइटम की पृष्ठभूमि को क्लिक या लंबी क्लिक पर बदलते हैं तो यह पृष्ठभूमि में परिवर्तन होता है और जब यह आइटम आपके डिवाइस के दृश्य क्षेत्र से बाहर स्क्रॉल किया जाता है तो इस आइटम से जुड़े दृश्य को पुनर्नवीनीकरण किया जाता है और इसे किसी अन्य सूची आइटम को आवंटित किया जाता है जो वर्तमान में दिखाई दे रहा है। तो अब वह आइटम भी हाइलाइट किया जाएगा। सूची दृश्य आप निम्न करना चाहिए में एक आइटम पर प्रकाश डाला के लिए

enter image description here


:
इस चित्र का वर्णन सूची दृश्य रीसाइक्लिंग

  • सूची दृश्य पर onItemClickListener सेट करें।
  • onItemClick() विधि में दृश्य की पृष्ठभूमि बदलती है और सूची दृश्य में वर्तमान हाइलाइट की गई स्थिति को सहेजती है और सूची एडाप्टर परडेटाडेट चेंज() को सूचित करती है। कॉलिंग अधिसूचना DataSetChanged() महत्वपूर्ण है क्योंकि यह वर्तमान दृश्यमान वस्तुओं को दोबारा हटा देता है।सूची onItemClick के लिए

कोड कुछ इस तरह होना चाहिए:

grid[pos].setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick (AdapterView<?> parent, 
        View v, int position, long Id) 
      { 
        highlighted = position; //highlighted is a global variable 
        //container is the root view of the list row layout 
        LinearLayout container = (LinearLayout)v.findViewById(R.id.container); 
        container.setBackgroundResource(R.drawable.highlighted_backg); 
        mListAdapter.notifyDataSetChanged(); 

      } 
    }); 

getView() विधि इस तरह लागू किया जाना चाहिए:

public View getView (int position, View convertView, ViewGroup parent) 
{ 
    ViewHolder holder; 

    if(convertView == null) { 
     convertView = inflater.inflate(R.layout.row_item, null); 
     holder = new ViewHolder(); 
     holder.itemName1 = (TextView)convertView.findViewById(R.id.text1); 
     ... 
     holder.container = (LineaLayout)convertView.findViewById(R.id.container); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    if(MainActivity.highlighted == position) { 
     holder.container.setBackgroundResource(R.drawable.highlighted_backg); 
    }else { 
     holder.foodItemCol1.setBackgroundResource(R.drawable.normal_back); 
    } 

    return convertView; 
} 
+0

मुझे बहुत मदद की। धन्यवाद। –

+0

बढ़िया! सबसे अच्छा जवाब बहुत अच्छा है! फुल लोडक पोस्ट करने के लिए – Kay

+0

वैसे भी? यह देखने की कोशिश कर रहा है कि यह मेरी वर्तमान स्थिति में कैसे फिट बैठता है लेकिन थोड़ा खो गया है –

1

सेट: जब 7 आइटम "unhighlighting" LogCat उत्पादन getView() में आइटम की पृष्ठभूमि रंग इसके चेक की गई स्थिति के अनुसार। मुझे नहीं पता कि क्या आप इसे सूची दृश्य से सीधे प्राप्त कर सकते हैं, अन्यथा आप उदा। एक Set और वर्तमान में चेक की गई स्थिति को पकड़ें। फिर getView() में देखें कि पास की स्थिति इस सेट में है, जिसका अर्थ यह होगा कि यह चेक किया गया है और पृष्ठभूमि के अनुसार सेट किया गया है। यदि नहीं, पृष्ठभूमि को अनचेक रंग पर सेट करें। बाद वाला एक महत्वपूर्ण है क्योंकि आपको 'चेक किए गए' रंग पर बैकग्राउंड सेट होने के बाद रीसाइक्लिंग दृश्य दिया जा सकता था।

चेक किए गए आइटमों का ट्रैक रखने के लिए एक उदाहरण here पाया जा सकता है।

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