मैं एक ListView
के लिए Adapter
की मदों की एक सूची के लिए HashMap
उपयोग करना चाहते हैं में HashMap का उपयोग करने का उपयोग करेगा। मैं ArrayAdapter<>
का उपयोग करने जा रहा था लेकिन मैं नहीं कर सकता क्योंकि यह केवल List<>
के साथ काम कर रहा है। मैं किस एडाप्टर का उपयोग करूं?क्या अनुकूलक मैं एक ListView
उत्तर
आप अपने मानचित्र प्रविष्टियों की एक सरणी प्राप्त कर सकते हैं:,
Entry<MyKey, MyValue>[] entries =
map.entrySet().toArray(new Entry<MyKey, MyValue>[0]);
कहा जा रहा है अगर तुम अनुकूलक में अपने नक्शे को अद्यतन करने या का उपयोग कर नक्शा सुविधाओं तो एक कस्टम एडाप्टर बनाने पर योजना बना रहे हैं मुश्किल नहीं है और होगा ज्यादा समझदारी करो।
आप BaseAdapter उपclassing से शुरू कर सकते हैं, जो आपको चलाने के लिए आवश्यक कुछ एडाप्टर विधियों के लिए सभी के लिए कार्यान्वयन प्रदान करता है।
कोई पूर्वनिर्धारित एडाप्टर नहीं हैं जो हैश मैप प्रस्तुत करेंगे। मैं बेसएडाप्टर को विस्तारित करके अपना खुद का एडाप्टर बनाने का सुझाव देता हूं।
संपादित करें:
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 का प्रयोग न करें :)
आप हैश मैप का उपयोग नहीं कर सकते हैं आपका विस्तारित बेसएडाप्टर क्लास है क्योंकि बेसएडाप्टर ListAdapter लागू करता है। – Eugene
उदाहरण – longhairedsi
से ऊपर जोड़ा गया है यदि कोई अभी भी समाधान ढूंढ रहा है, तो मैं सलाह देता हूं कि मेरे प्रश्न को इसी तरह के प्रश्न की जांच करें: http: // stackoverflow।कॉम/ए/1 9467717/18 9 1118 –
धन्यवाद जवाब 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;
}
}
अपने एडाप्टर फ़ाइल
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);
}
शब्दकोश में व्यवस्था बनाए रखने के लिए, यदि कुंजी प्रकार लागू होता है , आप उन्हें हमेशा अपने स्वयं के एक ऐरेलिस्ट में जोड़ सकते हैं यह Collections.sort का उपयोग कर, और इसके साथ आपके संदर्भ बिंदु के रूप में काम करते हैं।
private ArrayList<String> mKeys = new ArrayList<>();
for (String aKey :data.keySet()){
mKeys.add(aKey);
}
Collections.sort(mKeys);
आप क्या कर सकते हैं, IMHO, HashMap जिसे आप जोड़ना चाहते हैं, उसका वे कुंजी मान के लिए एक नई सूची उत्पन्न, और फिर कस्टम एडाप्टर के लिए उस सूची पार जाते हैं। फिर एडाप्टर में हैश मैप संग्रह आयात करें और संदर्भ कुंजी की सूची से HashMap.get(key);
का उपयोग करें।
- 1. एंड्रॉयड: जब मैं एक ListView
- 2. वेब अनुप्रयोग, अनुकूलक
- 3. अजीब क्वेरी अनुकूलक व्यवहार
- 4. मैं WPF ListView
- 5. क्या हम ListView
- 6. त्रुटि जब dm-mysql-अनुकूलक
- 7. एक ListFragment की ListView
- 8. ListView
- 9. ListView
- 10. ListView
- 11. ListView
- 12. ListView
- 13. ListView
- 14. ListView
- 15. ListView एक पंक्ति को अपडेट करना
- 16. ListView
- 17. ListView
- 18. ListView
- 19. एंड्रॉयड ListView: दिखाई आइटम
- 20. ListView
- 21. ListView
- 22. ListView
- 23. ListView
- 24. ListView
- 25. ListView
- 26. ListView
- 27. ListView
- 28. ListView
- 29. ListView
- 30. ListView
आप मानचित्र की सामान्य सरणी नहीं बना सकते हैं। प्रवेश 'अपवाद? –