package org.redcross.openmapkit; import android.app.Activity; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import com.spatialdev.osm.model.OSMElement; import org.redcross.openmapkit.odkcollect.ODKCollectData; import org.redcross.openmapkit.odkcollect.ODKCollectHandler; import org.redcross.openmapkit.odkcollect.tag.ODKTag; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; public class TagListAdapter extends BaseAdapter { private LayoutInflater inflater; private Map<String, String> tagMap; private ArrayList<String> tagKeys; public TagListAdapter(Activity activity, OSMElement osmElement) { tagMap = new LinkedHashMap<>(); if (ODKCollectHandler.isODKCollectMode()) { Map<String,String> tags = osmElement.getTags(); Map<String, String> readOnlyTags = new LinkedHashMap<>(tags); ODKCollectData odkCollectData = ODKCollectHandler.getODKCollectData(); Collection<ODKTag> requiredTags = odkCollectData.getRequiredTags(); for (ODKTag odkTag : requiredTags) { String key = odkTag.getKey(); String val = tags.get(key); if (Constraints.singleton().tagShouldBeShown(key, osmElement)) { tagMap.put(key, val); } readOnlyTags.remove(key); } Set<String> readOnlyKeys = readOnlyTags.keySet(); for (String readOnlyKey : readOnlyKeys) { tagMap.put(readOnlyKey, tags.get(readOnlyKey)); } } else { tagMap = osmElement.getTags(); } Set<String> keys = tagMap.keySet(); tagKeys = new ArrayList<>(); for(String key: keys) { tagKeys.add(key); } inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } /** * Implementing Adapter inherited abstract methods */ public int getCount() { return tagMap.size(); } /** * Implementing Adapter inherited abstract methods */ public Object getItem(int arg0) { return null; } /** * Implementing Adapter inherited abstract methods */ public long getItemId(int position) { return 0; } public boolean isEmpty() { if (tagMap == null || tagMap.size() == 0) { return true; } return false; } public String getTagKeyForIndex(int idx) { String[] keys = tagMap.keySet().toArray(new String[tagMap.size()]); return keys[idx]; } /** * Implementing Adapter inherited abstract methods */ public View getView(int position, View convertView, ViewGroup parent) { //create the view for an individual list view item ... View view = convertView; ViewHolder mViewHolder; if(convertView == null) { view = inflater.inflate(R.layout.taglistviewitem, null); mViewHolder = new ViewHolder(); mViewHolder.textViewTagKey = (TextView)view.findViewById(R.id.textViewTagKey); //left side tag key mViewHolder.textViewTagValue = (TextView)view.findViewById(R.id.textViewTagValue); //left side tag value view.setTag(mViewHolder); } else { mViewHolder = (ViewHolder)view.getTag(); } //tag key and value String currentTagKey = tagKeys.get(position); String currentTagValue = tagMap.get(currentTagKey); //labels for tag key and value String currentTagKeyLabel = null; String currentTagValueLabel = null; //attempt to assign labels for tag key and value if available from ODK Collect Mode if(ODKCollectHandler.isODKCollectMode()) { ODKCollectData odkCollectData = ODKCollectHandler.getODKCollectData(); if(odkCollectData != null) { try { currentTagKeyLabel = odkCollectData.getTagKeyLabel(currentTagKey); currentTagValueLabel = odkCollectData.getTagValueLabel(currentTagKey, currentTagValue); } catch (Exception ex) { Log.e("error", "exception raised when calling getTagKeyLabel or getTagValueLabel with tag key: '" + currentTagKey + "' and tag value: '" + currentTagValue + "'") ; } } } //present tag key if(currentTagKeyLabel != null) { mViewHolder.textViewTagKey.setText(currentTagKeyLabel); } else { mViewHolder.textViewTagKey.setText(currentTagKey); } //present tag value if(currentTagValueLabel != null) { mViewHolder.textViewTagValue.setText(currentTagValueLabel); } else { mViewHolder.textViewTagValue.setText(currentTagValue); } return view; } static class ViewHolder{ TextView textViewTagKey; TextView textViewTagValue; } }