2011-03-08 11 views
24

मैं एक ListView के लिए Adapter की मदों की एक सूची के लिए HashMap उपयोग करना चाहते हैं में HashMap का उपयोग करने का उपयोग करेगा। मैं ArrayAdapter<> का उपयोग करने जा रहा था लेकिन मैं नहीं कर सकता क्योंकि यह केवल List<> के साथ काम कर रहा है। मैं किस एडाप्टर का उपयोग करूं?क्या अनुकूलक मैं एक ListView

उत्तर

2

आप अपने मानचित्र प्रविष्टियों की एक सरणी प्राप्त कर सकते हैं:,

Entry<MyKey, MyValue>[] entries = 
    map.entrySet().toArray(new Entry<MyKey, MyValue>[0]); 

कहा जा रहा है अगर तुम अनुकूलक में अपने नक्शे को अद्यतन करने या का उपयोग कर नक्शा सुविधाओं तो एक कस्टम एडाप्टर बनाने पर योजना बना रहे हैं मुश्किल नहीं है और होगा ज्यादा समझदारी करो।

आप BaseAdapter उपclassing से शुरू कर सकते हैं, जो आपको चलाने के लिए आवश्यक कुछ एडाप्टर विधियों के लिए सभी के लिए कार्यान्वयन प्रदान करता है।

+1

आप मानचित्र की सामान्य सरणी नहीं बना सकते हैं। प्रवेश 'अपवाद? –

50

कोई पूर्वनिर्धारित एडाप्टर नहीं हैं जो हैश मैप प्रस्तुत करेंगे। मैं बेसएडाप्टर को विस्तारित करके अपना खुद का एडाप्टर बनाने का सुझाव देता हूं।

संपादित करें:

public class HashMapAdapter extends BaseAdapter { 

    private HashMap<String, String> mData = new HashMap<String, String>(); 
    private String[] mKeys; 
    public HashMapAdapter(HashMap<String, String> data){ 
     mData = data; 
     mKeys = mData.keySet().toArray(new String[data.size()]); 
    } 

    @Override 
    public int getCount() { 
     return mData.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return mData.get(mKeys[position]); 
    } 

    @Override 
    public long getItemId(int arg0) { 
     return arg0; 
    } 

    @Override 
    public View getView(int pos, View convertView, ViewGroup parent) { 
     String key = mKeys[pos]; 
     String Value = getItem(pos).toString(); 

     //do your view stuff here 

     return convertView; 
    } 
} 

यह निम्न चेतावनी के साथ आता है, वस्तुओं के आदेश में एक ही होने की गारंटी नहीं है: यह साथ HashMap उपयोग करने के लिए posible है और BaseAdapter बढ़ाया, यहाँ एक (untested) उदाहरण दिया गया है आदेश आपने उन्हें जोड़ा। इस उदाहरण को लिखने से मुझे एहसास हुआ है; एक एडाप्टर में HashMap का प्रयोग न करें :)

+0

आप हैश मैप का उपयोग नहीं कर सकते हैं आपका विस्तारित बेसएडाप्टर क्लास है क्योंकि बेसएडाप्टर ListAdapter लागू करता है। – Eugene

+2

उदाहरण – longhairedsi

+0

से ऊपर जोड़ा गया है यदि कोई अभी भी समाधान ढूंढ रहा है, तो मैं सलाह देता हूं कि मेरे प्रश्न को इसी तरह के प्रश्न की जांच करें: http: // stackoverflow।कॉम/ए/1 9467717/18 9 1118 –

16

धन्यवाद जवाब longhairedsi

यह निम्न चेतावनी के साथ आता है के लिए, आइटम के आदेश उसी क्रम आपने उन्हें शामिल होने की गारंटी नहीं है। इस उदाहरण को लिखने से मुझे एहसास हुआ है; एडाप्टर में हैश मैप का उपयोग न करें :)

इस समस्या को हल करने के लिए, इसके बजाय एक LinkedHashMap का उपयोग करें।

public class HashMapAdapter extends BaseAdapter { 
    private LinkedHashMap<String, String> mData = new LinkedHashMap<String, String>(); 
    private String[] mKeys; 
    public HashMapAdapter(LinkedHashMap<String, String> data){ 
     mData = data; 
     mKeys = mData.keySet().toArray(new String[data.size()]); 
    } 

    @Override 
    public int getCount() { 
     return mData.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return mData.get(mKeys[position]); 
    } 

    @Override 
    public long getItemId(int arg0) { 
     return arg0; 
    } 

    @Override 
    public View getView(int pos, View convertView, ViewGroup parent) { 
     String key = mKeys[pos]; 
     String Value = getItem(pos).toString(); 

     //do your view stuff here 

     return convertView; 
    } 
} 
+2

मुझे एक ही समस्या थी। मैं सूची > का उपयोग कर रहा हूं अब हैश मैप Klaasvaak

+2

के बजाय आप इस सीमा को ट्रीमैप का उपयोग करके दूर कर सकते हैं। – Skynet

0

अपने एडाप्टर फ़ाइल

MyAdapter.java

import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.BaseAdapter; 
    import android.widget.TextView; 

    import java.util.ArrayList; 
    import java.util.Map; 

    public class MyAdapter extends BaseAdapter { 
     private final ArrayList mData; 

     public MyAdapter(Map<String, String> map) { 
      mData = new ArrayList(); 
      mData.addAll(map.entrySet()); 
     } 

     @Override 
     public int getCount() { 
      return mData.size(); 
     } 

     @Override 
     public Map.Entry<String, String> getItem(int position) { 
      return (Map.Entry) mData.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      // TODO implement you own logic with ID 
      return 0; 
     } 

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

      if (convertView == null) { 
       result = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_adapter_item, parent, false); 
      } else { 
       result = convertView; 
      } 

      Map.Entry<String, String> item = getItem(position); 

      // TODO replace findViewById by ViewHolder 
      ((TextView) result.findViewById(R.id.text1)).setText(item.getKey()); 
      ((TextView) result.findViewById(R.id.text2)).setText(item.getValue()); 

      return result; 
     } 
    } 

कॉल इस एडाप्टर

public void showCinemas(HashMap<String, String> cinemas) { 
    MyAdapter adapter = new MyAdapter(cinemas); 
    list.setAdapter(adapter); 
} 
0

शब्दकोश में व्यवस्था बनाए रखने के लिए, यदि कुंजी प्रकार लागू होता है , आप उन्हें हमेशा अपने स्वयं के एक ऐरेलिस्ट में जोड़ सकते हैं यह Collections.sort का उपयोग कर, और इसके साथ आपके संदर्भ बिंदु के रूप में काम करते हैं।

private ArrayList<String> mKeys = new ArrayList<>(); 

for (String aKey :data.keySet()){ 
     mKeys.add(aKey); 
    } 
Collections.sort(mKeys); 
0

आप क्या कर सकते हैं, IMHO, HashMap जिसे आप जोड़ना चाहते हैं, उसका वे कुंजी मान के लिए एक नई सूची उत्पन्न, और फिर कस्टम एडाप्टर के लिए उस सूची पार जाते हैं। फिर एडाप्टर में हैश मैप संग्रह आयात करें और संदर्भ कुंजी की सूची से HashMap.get(key); का उपयोग करें।