java - 按日期对 RecyclerView 进行排序

标签 java android collections android-recyclerview nullpointerexception

我正在尝试按日期对 RecyclerView 进行排序,但我尝试了太多的事情,而且我现在不知道该尝试什么。问题出在 adapter.notifyDataSetChanged(); 行中,因为如果我不放置,则不会显示错误,但也不会更新 recyclerview

这就是我现在所拥有的,并向我显示了该错误。

Unable to start activity ComponentInfo{st.stc/sharetaxi.sharetaxicabdriver.PendingTrajectRecyclerView}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView$Adapter.notifyDataSetChanged()' on a null object reference'

首先,我将所有轨迹放入方法 GetAllTrajects() 中,并在 Collections.sort 中解析 TextView 的日期。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_pending_traject_recycler_view);

    listPendingTraject=new ArrayList<>();
    recyclerPendingTraject = (RecyclerView)findViewById(R.id.pendingTrajectRecyclerView);
    recyclerPendingTraject.setLayoutManager(new LinearLayoutManager(this));

      GetAllTrajects();

    Collections.sort(listPendingTraject, new Comparator<PendingTrajectPOJO>() {
        @Override
        public int compare(PendingTrajectPOJO pendingTrajectPOJO, PendingTrajectPOJO t1) {
            String Date = pendingTrajectPOJO.getDate();

            String Date1 = t1.getDate();

            Date date=null,date1=null;

            SimpleDateFormat formatDate = new SimpleDateFormat("dd/MMM/yyyy");
            try {
                date = formatDate.parse(Date);
                date1 = formatDate.parse(Date1);
            } catch (ParseException e) {
                e.printStackTrace();
            }


            return date.before(date1) ? 1 : 0;

        }
    });
    adapter.notifyDataSetChanged();
}

在方法 GetAllTrajects 中,当我放入所有信息时,我调用该方法 showPendingTraject()

  private void showPendingTraject() {
    listPendingTraject.add(new PendingTrajectPOJO(nameUsers,coordenatesOriginBundle,Origin,Destination,DataIHora,coordenatesDestiBundle,contadorCordenades));

    Log.d("ID",""+nomUser);
    adapter = new AdapterPendingTraject(listPendingTraject);
    recyclerPendingTraject.setAdapter(adapter);


}

最佳答案

一个简单的解决方案是在 PendingTrajectPOJO 存储日期中存储/输入数据(以毫秒为单位),该数据的类型为 long 而不是 String,然后您可以轻松比较 long 值并对其进行排序。

假设您的日期是 28/05/2018,那么您可以使用以下方法以毫秒为单位获取它:

String givenDateString = "28/05/2018"; 
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
try {
   Date mDate = sdf.parse(givenDateString);
   long timeInMilliseconds = mDate.getTime();
   //store this timeInMilliseconds in your POJO object
   System.out.println("Date in milli :: " + timeInMilliseconds);
} catch (ParseException e) {
        e.printStackTrace();
}

并使用 timeInMilliseconds 对其进行排序,只是在 RecyclerView 中显示时不要忘记将 timeInMilliseconds 转换为日期。

 Collections.sort(listPendingTraject, new Comparator<PendingTrajectPOJO>() {
    @Override
    public int compare(PendingTrajectPOJO pendingTrajectPOJO, PendingTrajectPOJO t1) {

        long Date = pendingTrajectPOJO.getDate();
        long Date1 = t1.getDate();

        return Date.compareTo(Date1);
    }
});

关于java - 按日期对 RecyclerView 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50562960/

相关文章:

java - 将 JTable 添加到 JScrollPane

java - Android - Talkback 在内容描述结束时宣布类类型。

java - 无法在 Java 中初始化 Singleton 类中的静态成员 - Android

collections - 与 Vec 相比迭代 HashMap 值

java - 为数据库创建实体

java - 是否存在将 Java 对象序列化为 JSON 的模式?

java - 如何区分 ActionEvent 中的多个组合框

android - 在 Android 中制作完美的 Chromeless Youtube 播放器

java - 通过坐标访问游戏对象,同时仍然能够轻松移动它们

java - 更新 map