2017-02-20 53 views
0

最大的价值我想排序包含HashMap排序的ArrayList <HashMap的<字符串,对象>>从顶部

的ArrayList

的ArrayList <的HashMap <字符串,对象>>

在下面的类

public class NotificationFragment extends ListFragment { 
 

 
    private static final String TAG = "NotificationFragment"; 
 
    private DatabaseReference mDatabaseReference; 
 
    private ProgressBar mProgressBar; 
 

 
    String[] from = {"TITLE","BODY","TIME"}; 
 
    int[] to = {R.id.single_notification_row_title, 
 
      R.id.single_notification_row_body, 
 
      R.id.single_notification_row_time}; 
 

 
    ArrayList<HashMap<String,Object>> data; 
 

 
    SimpleAdapter adapter; 
 

 
    public NotificationFragment() { 
 
     // Required empty public constructor 
 
    } 
 

 
    @Override 
 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
 
          Bundle savedInstanceState) { 
 
     Log.d(TAG, "onCreateView"); 
 
     // Inflate the layout for this fragment 
 
     View view = inflater.inflate(R.layout.fragment_notification, container, false); 
 

 
     return view; 
 
    } 
 

 
    @Override 
 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
 
     super.onActivityCreated(savedInstanceState); 
 

 
     //Set Activity title 
 
     getActivity().setTitle(R.string.Notifications); 
 

 
     mDatabaseReference = FirebaseDatabase.getInstance().getReference() 
 
       .child("Notification").child("Android"); 
 

 
     Query query = mDatabaseReference.orderByChild("title"); 
 

 
     query.addListenerForSingleValueEvent(new ValueEventListener() { 
 
      @Override 
 
      public void onDataChange(final DataSnapshot dataSnapshot) { 
 

 
       getNewData((Map<String,Object>)dataSnapshot.getValue()); 
 
      } 
 

 
      @Override 
 
      public void onCancelled(DatabaseError databaseError) { 
 

 
       Toast.makeText(getActivity(), R.string.Something_went_wrong_retry, Toast.LENGTH_SHORT).show(); 
 
      } 
 
     }); 
 

 

 
    } 
 

 
    private void cancelNotification(Activity activity, int notifyId) { 
 
     String ns = Context.NOTIFICATION_SERVICE; 
 
     NotificationManager nMgr = (NotificationManager) activity.getSystemService(ns); 
 
     nMgr.cancel(notifyId); 
 
    } 
 

 
    private void getNewData (Map<String,Object> mapDatabase){ 
 

 
     mProgressBar = (ProgressBar)getActivity().findViewById(R.id.progressBarNotifications); 
 

 
     data = new ArrayList<>(); 
 

 
     try{ 
 

 
      //Iterate through each notification 
 
      for(Map.Entry<String,Object> entry : mapDatabase.entrySet()){ 
 
       Log.e(TAG, "ForEach entered"); 
 

 
       Map singleNotification = (Map)entry.getValue(); 
 

 
       //Fill the list 
 
       String title = (String) singleNotification.get("title"); 
 
       String body = (String) singleNotification.get("body"); 
 
       String time = (String) singleNotification.get("time"); 
 
       String timeLong = (String) singleNotification.get("timeStamp"); 
 

 
       HashMap<String,Object> map = new HashMap<>(); 
 
       map.put("TITLE", title); 
 
       map.put("BODY", body); 
 
       map.put("TIME", time); 
 
       map.put("timeLong", timeLong); 
 

 
       data.add(map); 
 
       Log.d(TAG,"data.add(map)"); 
 
       Log.d(TAG,"data.size = " + data.size()); 
 
      } 
 

 
      for(HashMap<String, Object> myMap: data) { 
 
       for(Map.Entry<String, Object> mapEntry: myMap.entrySet()) { 
 
        String key = mapEntry.getKey(); 
 
        String value = (String) mapEntry.getValue(); 
 
        if(key.equals("timeLong")){ 
 
         Log.d(TAG,"timeLong = " + value); 
 
         //?????????HOW TO SORT by LONG VALUE ?????????? 
 
        } 
 
       } 
 
      } 
 
      //Adapter 
 
      adapter = new SimpleAdapter 
 
        (getActivity(),data,R.layout.single_notification_row ,from,to); 
 

 
      setListAdapter(adapter); 
 
      Log.d(TAG,"setListAdapter(adapter)"); 
 
     }catch (NullPointerException e){ 
 
      Toast.makeText(getActivity(), R.string.No_Notifications, Toast.LENGTH_SHORT).show(); 
 
     } 
 
     if(mProgressBar.getVisibility() == View.VISIBLE){ 
 
      mProgressBar.setVisibility(View.GONE); 
 
     } 
 
     cancelNotification(getActivity(), 0); 
 
    } 
 
    @Override 
 
    public void onStart() { 
 
     super.onStart(); 
 

 
     getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { 
 
      @Override 
 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
 

 
       Toast.makeText(getActivity(), "HI", Toast.LENGTH_SHORT).show(); 
 
      } 
 
     }); 
 
    } 
 
}

我得到以下排序顺序:

Screenshot

请注意,我有一个单一的长项在每一个ArrayList的项目(称为 “timeLong”)。

谢谢你在前进, 加埃塔诺

+1

你的问题是,你有一个'的Hashmap <字符串,对象>',而不是类 – EpicPandaForce

回答

1

,我建议你创建一个包含4个属性的类:

String title; 
String body; 
String time; 
long timeLong; 

可以说类的名称是实例。获取数据时,创建此类的实例并设置此实例的属性,而不是有4个字符串值。

改变你的ArrayList这个ArrayList<Instance> myList = ArrayList();

创建一个类

public class SortingClass implements Comparator<Instance> 
{ 
    public int compare(Instance left, Instance right){ 
      return left.timeLong < right.timeLong ? 1 : -1; 
} 

而对于排序

Collections.sort(myList,new SortingClass()) 
+0

我不太确定我的理解。你能为我写一段关于ArrayList的代码吗? –

+0

我试过了,但SimpleAdapter不接受ArrayList ...非常感谢您 –

+0

您可以实现自己的适配器,从ArrayAdapter 扩展它。然后,你可以填充它并将它传递给你的列表视图。 – anzaidemirzoi

相关问题