2011-03-08 6 views

답변

2

: 당신이 다음 사용자 정의 어댑터를 만드는 어댑터에지도 기능을지도를 업데이트하거나 사용을 계획하는 경우,

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

말했다되고 그것은 어려운 일이 아니다 및 것 훨씬 더 의미가 있습니다.

BaseAdapter의 하위 클래스로 시작하면 시작할 필요가 있습니다.이 서브 클래스를 사용하면 실행해야하는 몇 가지 어댑터 방법을 구현할 수 있습니다.

+1

어떻게' Map.Entry '예외의 일반적인 배열을 만들 수 없습니까? –

50

HashMap을 렌더링 할 사전 정의 된 어댑터가 없습니다. BaseAdapter를 확장하여 자신의 어댑터를 만드는 것이 좋습니다.

편집 :

이 다음과 같은 경고와 함께 제공
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의 사용 추적 할 수없는 가망하고 BaseAdapter 확장, 여기 (안된) 예제 주문을 추가했습니다. 이 예를 쓰면 나를 알게되었습니다. 어댑터에서의 HashMap을 사용하지 마십시오 :

+0

BaseAdapter가 ListAdapter를 구현하기 때문에 HashMap은 확장 된 BaseAdapter 클래스입니다. – Eugene

+2

위의 예제를 추가 한 사람이 여전히 해결책을 찾고 있다면 – longhairedsi

+0

, 나는 비슷한 질문에 대한 나의 대답을 확인한다 : http : // stackoverflow.co.kr/a/19467717/1891118 –

16

감사 응답 longhairedsi이 다음과 같은 경고와 함께 제공

를 들어, 항목의 순서는 당신이 그 (것)들을 추가 한 순서로 보장 할 수 없습니다. 이 예를 쓰면 나를 알게되었습니다. 어댑터에서 HashMap을 사용하지 마십시오.

이 문제를 해결하려면 대신 LinkedHashMap을 사용하십시오. 어댑터 파일

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); 
} 
+2

동일한 문제가있었습니다. HashMap 대신 List 을 사용하고 있습니다. Klaasvaak

+2

TreeMap을 사용하여이 제한을 극복 할 수 있습니다. – Skynet

0

, 키의 형태에 적용 할 경우 , 당신은 항상 그들 자신의 ArrayList에 정렬을 추가 할 수 있습니다. 그것은 Collections.sort를 사용하고 그것을 참조 점으로 사용합니다. 당신이 할 수있는 일

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

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

가 사전에 질서를 유지하기 위해이 어댑터에서

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; 
    } 
} 
0

는 이럴 사용자 지정 어댑터에 그 목록을 통과 한 다음 추가하려는 해시 맵의 그들은 키 값에 대한 새로운 목록을 생성하고있다. 그런 다음 어댑터에서 HashMap 컬렉션을 가져오고 HashMap.get(key);을 참조 키 목록에서 사용하십시오.

관련 문제