如何根据日期和时间对我的RecyclerView进行排序

时间:2017-01-18 09:54:21

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

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

RecyclerView图片 enter image description here  这是我的火力架结构

Firebase图片 enter image description here

  

添加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 - &gt;这是我的数据设置

    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 - &gt;这是我显示我的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);
        }
    }


}

3 个答案:

答案 0 :(得分: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);
}

我认为这应该是全部..哦,并删除所有旧的约会,因此它不会导致例外。

答案 1 :(得分:0)

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

this is firebase date store in millis

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

 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());
        }
    });

输出为: -

14-01-1970

26-01-1970

1970年6月3日

14-04-1970

答案 2 :(得分:0)

我制作了一个送餐应用程序,订单历史记录中按日期存储了日期,如您所见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);