【问题标题】:How to sort my RecyclerView according to date and time如何根据日期和时间对我的 RecyclerView 进行排序
【发布时间】:2017-06-02 15:22:31
【问题描述】:

如图所示,我的列表没有按日期和时间排序

回收站查看图片 这是我的火力基地结构

Firebase 图片

添加 Appointment.java -> 这就是我将数据添加到 firebase 的方式

  public class AddAppointment extends AppCompatActivity {

    private FirebaseAuth firebaseAuth;
    private FirebaseUser mCurrentUser;


    private EditText dateApp,timeApp,nameTxt,addressTxt,telTxt;
    int mYear,mMonth,mDay,mHour,mMinute;
    private Button saveBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_appointment);
        Firebase.setAndroidContext(this);


        nameTxt = (EditText) findViewById(R.id.nameText);
        addressTxt= (EditText) findViewById(R.id.addressText);
        telTxt = (EditText) findViewById(R.id.telText);
        dateApp = (EditText)findViewById(R.id.dateAppointment);
        timeApp = (EditText)findViewById(R.id.timeAppointment);
        dateApp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                datePic();
            }
        });
        timeApp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                timePic();
            }
        });
        saveBtn = (Button)findViewById(R.id.saveBtn);
        saveBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                firebaseAuth = FirebaseAuth.getInstance();
                mCurrentUser = firebaseAuth.getCurrentUser();
                DatabaseReference db= FirebaseDatabase.getInstance().getReference().child("Email").child(mCurrentUser.getUid()).child("Appointment").push();
                String name = nameTxt.getText().toString().trim();
                String address = addressTxt.getText().toString().trim();
                String tel = telTxt.getText().toString().trim();
                String date = dateApp.getText().toString().trim();
                String time = timeApp.getText().toString().trim();

                //Adding values
                db.child("name").setValue(name);
                db.child("address").setValue(address);
                db.child("tel").setValue(tel);
                db.child("date").setValue(date);
                db.child("time").setValue(time);

                //Storing values to firebase
                Toast.makeText(AddAppointment.this,"Saved",Toast.LENGTH_SHORT).show();
                Intent mainIntent = new Intent(AddAppointment.this,MainActivity.class);
                startActivity(mainIntent);
            }
        });
    }
    public  void datePic()
    {
        final Calendar c = Calendar.getInstance();
        mYear = c.get(Calendar.YEAR);
        mMonth = c.get(Calendar.MONTH);
        mDay = c.get(Calendar.DAY_OF_MONTH);

        DatePickerDialog datePickerDialog = new DatePickerDialog(this,new DatePickerDialog.OnDateSetListener(){
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth){
                mYear = year;
                mMonth = monthOfYear+1;
                mDay = dayOfMonth;
                dateApp.setText((mDay+"-"+mMonth+"-"+mYear));
            }
        },mDay,mMonth,mYear);
        datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
        datePickerDialog.show();
    }
    public  void timePic()
    {
        final Calendar c = Calendar.getInstance();
        mHour = c.get(Calendar.HOUR_OF_DAY);
        mMinute = c.get(Calendar.MINUTE);

        TimePickerDialog timePickerDialog = new TimePickerDialog(this,new TimePickerDialog.OnTimeSetListener(){
            @Override
            public void onTimeSet(TimePicker view, int hourOfDay, int minute){
                int hour = hourOfDay % 12;
                timeApp.setText(String.format("%02d:%02d %s", hour == 0 ? 12 : hour,
                        minute, hourOfDay < 12 ? "a.m." : "p.m."));
            }
        },mHour,mMinute,false);
        timePickerDialog.show();
    }
}

AppointmentData.java -> 这是我的数据设置

    public class AppointmentData {

    private String name,tel,address,time,date;

    public AppointmentData() {
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public AppointmentData(String name, String tel, String address, String time, String date) {
        this.name=name;
        this.tel=tel;
        this.address=address;
        this.time=time;
        this.date=date;
    }

    public String getName() {
        return name;
    }

    public String getTel() {
        return tel;
    }

    public String getAddress() {
        return address;
    }

    public String getDate() {
        return date;
    }

    public String getTime() {
        return time;
    }

}

ViewAppointment.java -> 这就是我显示我的 recyclerview 的方式

 public class ViewAppointment extends AppCompatActivity {

    private FirebaseAuth firebaseAuth;
    private FirebaseUser mCurrentUser;
    private DatabaseReference db;
    private RecyclerView recyclerView;
    private FirebaseRecyclerAdapter<AppointmentData,myViewHolder> mAdapter;


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


        recyclerView=(RecyclerView)findViewById(R.id.recycle);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        firebaseAuth = FirebaseAuth.getInstance();

        mCurrentUser = firebaseAuth.getCurrentUser();
        db= FirebaseDatabase.getInstance().getReference().child("Email").child(mCurrentUser.getUid()).child("Appointment");
        db.keepSynced(true);
        mAdapter= new FirebaseRecyclerAdapter<AppointmentData, myViewHolder>(

                AppointmentData.class,R.layout.model,myViewHolder.class,db
        ) {


            @Override
            protected void populateViewHolder(final myViewHolder viewHolder, final AppointmentData model, final int position) {
                viewHolder.nameTxt.setText(model.getName());
                viewHolder.dateApp.setText(model.getDate());
                viewHolder.timeApp.setText(model.getTime());
                viewHolder.mapBtn.setText("Map");
                viewHolder.detailBtn.setText("Detail");
                viewHolder.deleteBtn.setText("Delete");
                viewHolder.editBtn.setText("Edit");
                Log.e("myFirebase UID", mAdapter.getRef(position).getKey());
                viewHolder.editBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Intent i = new Intent (view.getContext(), UpdateAppointment.class);
                        i.putExtra("NAME_KEY",model.getName());
                        i.putExtra("ADDRESS_KEY",model.getAddress());
                        i.putExtra("TEL_KEY",model.getTel());
                        i.putExtra("DATE_KEY",model.getDate());
                        i.putExtra("TIME_KEY",model.getTime());
                        view.getContext().startActivity(i);
                        Log.e("Item Click position",""+position);
                        mAdapter.getRef(+position).removeValue();
                    }
                });
                viewHolder.detailBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Intent i = new Intent (view.getContext(), DetailActivity.class);
                        i.putExtra("NAME_KEY",model.getName());
                        i.putExtra("ADDRESS_KEY",model.getAddress());
                        i.putExtra("TEL_KEY",model.getTel());
                        i.putExtra("DATE_KEY",model.getDate());
                        i.putExtra("TIME_KEY",model.getTime());
                        view.getContext().startActivity(i);
                    }
                });
                viewHolder.mapBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Intent i = new Intent (view.getContext(), Distance.class);
                        i.putExtra("ADDRESS_KEY",model.getAddress());
                        view.getContext().startActivity(i);
                    }
                });
                viewHolder.deleteBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Log.e("Item Click position",""+position);
                        mAdapter.getRef(+position).removeValue();
                    }
                });
            }
        };
        recyclerView.setAdapter(mAdapter);

    }
    public static class myViewHolder extends RecyclerView.ViewHolder{
        private TextView nameTxt,dateApp,timeApp;
        private Button detailBtn,mapBtn,deleteBtn,editBtn;

        public myViewHolder(View itemView){
            super(itemView);
            nameTxt=(TextView)itemView.findViewById(R.id.nameTxt);
            dateApp= (TextView) itemView.findViewById(R.id.dateAppointment);
            timeApp=(TextView)itemView.findViewById(R.id.timeAppointment);
            mapBtn = (Button) itemView.findViewById(R.id.mapBtn);
            detailBtn = (Button) itemView.findViewById(R.id.detailBtn);
            deleteBtn = (Button) itemView.findViewById(R.id.deleteBtn);
            editBtn = (Button) itemView.findViewById(R.id.editBtn);
        }
    }


}

【问题讨论】:

  • 最好的办法是将毫秒存储在 FIREBASE 数据库中,然后排序 .very easy 而不是存储日期

标签: android sorting firebase android-recyclerview firebase-realtime-database


【解决方案1】:

更改对您的 AppointmentData 进行以下更改

public class AppointmentData {
  // ...
  private Object date;
  // ...
  public void setDate(Object date) {
      this.date = date;
  }
  // ...
  public AppointmentData(String name, String tel, String address, String time, Object date) {
      // ...
  }
  // ...    
  public Object getDate() {
      return date;
  }
}

将数据库更改为:

Query db = FirebaseDatabase.getInstance().getReference().child("Email").child(mCurrentUser.getUid()).child("Appointment").orderByChild("date");

将 populateViewHolder 中的这一行更改为:viewHolder.dateApp.setText(timestampToDateString(model.getDate()));

其中 timestampToDateString 是一个实用方法:

public static String timestampToDateString(long timestamp){
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
    Date date = new Date(timestamp);
    return dateFormat.format(date);
}

将 btnSave.onClickListener 更改为此

    final String key = FirebaseDatabase.getInstance().getReference().child("Email").child(mCurrentUser.getUid()).child("Appointment").push().getKey();

    // ...
    Long date = mSelectedDate;
    // ...
    AppointmentData appointmentData = new AppointmentData(name, tel, address, time, date);

    FirebaseDatabase.getInstance().getReference().child("Email").child(mCurrentUser.getUid()).child("Appointment").child(key).setValue(appointmentData);
    // ...

像这样添加字段

private long mSelectedDate;

像这样在 datePic() 中初始化它

    // ...
    mYear = c.get(Calendar.YEAR);
    // ...
    mSelectedDate = fieldToTimestamp(mYear, mMonth, mDay);

在 onDateSelectedListener.onDateSet(...) 中像这样

// ...
mSelectedDate = fieldToTimestamp(year, monthOfYear, dayOfMonth);

fieldToTimestamp 是辅助方法

private long fieldToTimestamp(int year, int month, int day) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR, year);
    calendar.set(Calendar.MONTH, month);
    calendar.set(Calendar.DAY_OF_MONTH, day);
    return (long) (calendar.getTimeInMillis() / 1000L);
}

我认为这应该就是全部了。哦,删除所有旧约会,这样就不会导致异常。

【讨论】:

  • 我试过你的代码,但有很多错误,因为将 db 更改为 Query 部分适用于我的 ViewAppointment.java 那边?此外,对于放在我的 populateView 中的代码,在我插入 fieldToTimestamp 后,“model.getDate”端会显示错误。然后对于那里的saveBtn,错误是代码“Long date”那部分。最后,onDateSelectedListener 是否在我的 datepickerdialog tat 部分发生了变化?我不知道在哪里申报
  • 向 linxydev@gmail.com 发送电子邮件,这样 cmets 就不会在 SO 中收到垃圾邮件,我会帮助您解决错误
【解决方案2】:

这是可以解决您问题的示例

// 上面我有毫秒格式的存储日期。

 ref.child("date").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                ArrayList<Long> d = new ArrayList<>();
                for (DataSnapshot child : dataSnapshot.getChildren()) {
                  // save all millis in array list you can take your Bean class also
                    try {
                        long daa = Long.parseLong(child.getValue().toString());
                        d.add(daa);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
             // sort array list you can use comparator if you have bean class
                Collections.sort(d);
                for (int i = 0; i < d.size(); i++) {
                    String dateString = new SimpleDateFormat("dd-MM-yyyy").format(new Date(d.get(i)));
                    Log.e("!_@@ date", dateString + "");
                }
            }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            Log.e("!!__: ", "onCancelled ", firebaseError.toException());
        }
    });

输出是:-

1970 年 14 月 1 日

26-01-1970

06-03-1970

1970 年 14 月 4 日

【讨论】:

  • 先生~参考你的代码,但我不知道如何用我的代码修复....你能指导我吗?
【解决方案3】:

我制作了一个送餐应用程序,其中订单历史记录存储日期,如您所见Order History 先看看我的数据库Database

现在,如果您仔细查看我的数据库,您将了解其背后的逻辑。逻辑很简单,而不是使用 RandomUId = UUID.randomUUID().toString(); 我曾使用 RandomUId = getrandoumUID();getrandoumUID()

public String getrandoumUID(){

    Calendar cr = Calendar.getInstance();
    SimpleDateFormat sdfr = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
    Date todayr = cr.getTime();
    String dater = sdfr.format(todayr);

    return dater;
}

当您将数据存储到 firebase 而不是使用随机 uid 时,只需使用此方法。 现在,当您在 recyclerview 中正常检索此数据时,它将以相反的顺序检索,以确保仅将列表中的每个项目添加到第 0 个索引处

ArrayList.add(0,item);
adapter.notifyDataSetChanged();

确保在OnCreate()函数中声明以下步骤

    recyclerView = findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(Activity.this));
    ArrayList= new ArrayList<>();
    adapter = new Adapter(Activity.this,ArrayList);
    recyclerView.setAdapter(adapter);

【讨论】:

    【解决方案4】:

    您可以使用具有可比较界面的 kotlin lamda 来比较日期以整理列表。首先在列表类型模型中实现可比较接口,然后使用 Collection.Sort(Listname)

    vaccinationTypesList.sortWith { o1, o2 ->
        o1.vaccinationDate
          .compareTo(o2.vaccinationDate)
    }
    

    【讨论】:

    • 请在您的代码周围添加一些解释,特别是因为这些标识符都没有出现在问题的任何地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多