2013-10-19 6 views
14

मेरे पास हैश मैप है, मैं इसे सूची दृश्य में कैसे रख सकता हूं? किस एडाप्टर का उपयोग करने की आवश्यकता है?सूची दृश्य में हैश मैप

public void showCinemas(HashMap<String, String> cinemas) 
{ 
    ...//What? 
    list.setAdapter(adapter); 
} 

उत्तर

46

सरल एडाप्टर वर्ग बनाओ:

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(android.R.id.text1)).setText(item.getKey()); 
     ((TextView) result.findViewById(android.R.id.text2)).setText(item.getValue()); 

     return result; 
    } 
} 

लेआउट/my_adapter_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     > 

    <TextView 
      android:id="@android:id/text1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      /> 

    <TextView 
      android:id="@android:id/text2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      /> 
</LinearLayout> 

आपका कोड:

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

ग्रेट !! मैं एक जेसन से टीवी चैनलों की एक सूची खींच रहा हूं: छवि, नाम और संख्या। छवियों को स्वयं निहित छवि डाउनलोडर वर्ग के साथ प्राप्त यूआरएल का उपयोग करके लोड किया जाता है। यदि आपको इसकी आवश्यकता हो सकती है तो मुझे बताएं, आईडी साझा करने में खुशी होगी। – Josh

+2

यह प्रविष्टिसेट के बजाय मूल्य() नहीं होना चाहिए? – cafebabe1991

+1

इसके लिए OnItemClickListener को कैसे संभालें? – Madhan

0

इसकी निष्पक्ष सरल:

सूची आइटम आप उदाहरण के लिए, बनाने के लिए जा रहे हैं के लिए

। कहते हैं कि तुम नाम की तरह सूची आइटम में विद्यार्थी का रिकॉर्ड रख दिया और को संबोधित

private HashMap<String,Object> prepareListViewItems(Student[] student) 
{ 
ArrayList<HashMap<String,Object>> listdata = new ArrayList<HashMap<String,Object>>(); 

for(int index=0;index<student.size();index++) 
{ 
    HashMap<String,Object> data = new HashMap<String,Object>(); 
    data.put("roll", student[indxe].roll); 
    data.put("address", student[indxe].address); 
    data=null; 
    listdata.add(data); 

} 

return data; 
} 

private void setListAdapter(Student[] students) 
{ 
    TestListAdapter adapter = new TestListAdapter(prepareListViewItems(students)) 
    list.setAdapter(adapter); 
} 

लेकिन, जब आप एक कस्टम एडाप्टर पैदा कर रहे हैं, वहाँ hashmap बनाने के लिए कोई जरूरत नहीं है करने के लिए है, केवल सरणी अपने उद्देश्य के लिए पर्याप्त होगा।

+0

वह '' 'ListView''' में कुंजी-मान पेयर दिखाने की जरूरत है, तो' '' की ArrayList''' '' 'HashMap''' –

+0

मदद नहीं करेगा आप' सेट करते हैं डेटा = बातिल; ** ** सूची से डेटा जोड़ने से पहले ** **, आप हमेशा सूचीडेटा में शून्य जोड़ रहे हैं। क्या मै गलत हु? –

+0

आपका क्या मतलब है "केवल सरणी पर्याप्त होगी"? बकवास। नीचे पूरा जवाब देखें। इस मामले में मैं अपना खुद का हैशप बनाए रखता हूं लेकिन कोई सरणी की आवश्यकता नहीं होती है। – RichieHH

4

हैश मैप 2 संग्रह (या बेहतर 1 संग्रह और 1 सेट) से बना है, इसलिए यह ArrayAdapter को विस्तारित करना वास्तव में संभव नहीं है; लेकिन आप आसानी से (या बेहतर एक सेट) Map.Entry का एक संग्रह प्राप्त कर सकते हैं, और यह एक सूची में कन्वर्ट:

से:

Map<String, Object> map = new HashMap<String, Object>(); 

रहे हैं:

List<Map.Entry<String, Object>> list = new ArrayList(map.entrySet()); 

तो मैं का उपयोग इस तरह एक व्युत्पन्न ArrayAdapter:

class HashMapArrayAdapter extends ArrayAdapter { 

     private static class ViewHolder { 
      TextView tV1; 
      TextView tV2; 
     } 

     public HashMapArrayAdapter(Context context, int textViewResourceId, List<Map.Entry<String, Object>> objects) { 
      super(context, textViewResourceId, objects); 
     } 

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

      ViewHolder viewHolder; 

      if (convertView == null) { 
       convertView = LayoutInflater.from(getContext()).inflate(android.R.layout.simple_list_item_2, parent, false); 
       viewHolder = new ViewHolder(); 
       viewHolder.tV1 = (TextView) convertView.findViewById(android.R.id.text1); 
       viewHolder.tV2 = (TextView) convertView.findViewById(android.R.id.text2); 
       convertView.setTag(viewHolder); 
      } else 
       viewHolder = (ViewHolder) convertView.getTag(); 

      Map.Entry<String, Object> entry = (Map.Entry<String, Object>) this.getItem(position); 

      viewHolder.tV1.setText(entry.getKey()); 
      viewHolder.tV2.setText(entry.getValue().toString()); 
      return convertView; 
     } 

और फिर एडाप्टर बनाने के लिए:

ArrayAdapter adapter = new HashMapArrayAdapter(this.getActivity(), android.R.layout.simple_list_item_2, new ArrayList(map.entrySet()));