Динамический раздел заголовка RecyclerView с использованием текущей даты и времени

Я буду использовать RecyclerView для заголовка раздела

Я хочу создать заголовок раздела, когда я вставляю данные Date & Time в SQLite Database

Я следил за ссылками для этого решения, но не был успешным

Пожалуйста, обратитесь к приведенному ниже изображению

enter image description here

Для данных вышеприведенного изображения с использованием приведенного ниже кода ИЛИ Раздел является статическим:

List<Company> childList = new ArrayList<>();
        List<CompanySectionHeader> sectionHeaders = new ArrayList<>();

        childList = myDb.getAllCompany();
        sectionHeaders.add(new CompanySectionHeader(childList, "WEDNESDAY 4 APRIL", 1));

Теперь Если предположить, что я ввожу сегодня данные, тогда я создаю 1 заголовок раздела, принимающий сегодня дату

Под заголовком раздела данных изображения ниже Static или данные также:

enter image description here

Над данными изображения получают использование ниже кода:

childList.add(new Company("Ketul Inc.", "11/11/2017 3:46 PM"));
        childList.add(new Company("Atmel Corporation", "09/19/2017 8:46 PM"));
        childList.add(new Company("ABC Technologies", "09/12/2017 7:41 PM"));
        childList.add(new Company("Huron Capital Partners LLC", "09/12/2017 7:25 PM"));
        sectionHeaders = new ArrayList<>();
        //Create a List of SectionHeader DataModel implements SectionHeader
        sectionHeaders.add(new CompanySectionHeader(childList, "SATURDAY 7 APRIL", 2));

Ниже код - это мой SectionHeader.Java:

public class CompanySectionHeader implements Section<Company>, Comparable<CompanySectionHeader> {

    List<Company> childList;
    String sectionText;
    int index;

    public CompanySectionHeader(List<Company> childList, String sectionText, int index) {
        this.childList = childList;
        this.sectionText = sectionText;
        this.index = index;
    }

    @Override
    public List<Company> getChildItems() {
        return childList;
    }

    public String getSectionText() {
        return sectionText;
    }

    @Override
    public int compareTo(CompanySectionHeader another) {
        if (this.index > another.index) {
            return -1;
        } else {
            return 1;
        }
    }
}

Ниже приведена моя структура базы данных SQLite:

public String getFromatDate(long dateTime) {
        String formatedDate;
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(dateTime);
        Date mDate = calendar.getTime();
        SimpleDateFormat sdf;
        sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm a", new Locale("en"));
        formatedDate = sdf.format(mDate);
        return formatedDate;
    }

    public long insertCompany(Company company){

        //String sql = null;
        SQLiteDatabase db = dbHelper.getWritableDatabase();

        ContentValues values = new ContentValues();

        values.put(DatabaseHelper.KEY_COMPANY_NAME, company.getName());
        values.put(DatabaseHelper.KEY_CREATED_AT, System.currentTimeMillis());
        values.put(DatabaseHelper.KEY_UPDATED_AT, System.currentTimeMillis());
        values.put(DatabaseHelper.KEY_COMPANY_WEBSITE,company.getWebsite());
        values.put(DatabaseHelper.KEY_COMPANY_EMAIL,company.getEmail());
        values.put(DatabaseHelper.KEY_COMPANY_PHONE_HOME,company.getPhoneHome());

        long company_id = db.insert(COMPANY, null, values);

        return company_id;
    }

Мой вопрос: как создать заголовок раздела динамически

Если вам нужен какой-либо код или информация, вы можете спросить меня :)

Заранее спасибо:

Ответ 1

Я недавно сделал это для сортировки чего-то на Monthly Basis. Его переопределение функции ViewType.

Screenshot

Для этого вам нужно использовать что-то вроде getViewType() в адаптере Recycler.

public class LastTransAdapter extends RecyclerView.Adapter<LastTransAdapter.ViewHolder> {
    private ArrayList<LastTransBean> lastTransBeans;
    private Context context;

    private MyCustomTextView textViewTitle, tv_Desc, tv_Date, tv_Amount;
    private LinearLayout layout1;
    private View customView, myView;

    private LayoutParams layoutParams;

    private PopupWindow popUpWindow = null;

    private RelativeLayout layout;

    private int MONTHHEADER = 1;
    private int DATAVIEW = 2;


    public LastTransAdapter(ArrayList<LastTransBean> lastTransBeans, Context context, View myView, RelativeLayout layout) {
        this.lastTransBeans = lastTransBeans;
        this.context = context;
        this.myView = myView;
        this.layout = layout;

    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {

        if (i == DATAVIEW) {

             // view for normal data.


            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.single_row_last_transactions, viewGroup, false);
            return new ViewHolder(view);
        } else {

            // view type for month or date header

            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.single_row_month_header, viewGroup, false);
            return new ViewHolder(view);
        }
    }


    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int i) {

        final int position = i;

        if (viewHolder.getItemViewType() == DATAVIEW) {

            //fill data for normal view


        } else {
            //set your date or month header
        }

    }

    @Override
    public int getItemCount() {
        return lastTransBeans.size();
    }

    @Override
    public int getItemViewType(int position) {
        if (lastTransBeans.get(position).getMonth()) {
            return MONTHHEADER;
        } else {
            return DATAVIEW;
        }
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        MyCustomTextView transtile, transdate, transamont, tv_monthHeader;
        LinearLayout acctype;
        CardView mlastTransCardView;


        public ViewHolder(View itemView) {
            super(itemView);

           // cast all the textviews , buttonsetc used ion view Holder.

        }
    }
}

Вы также можете использовать несколько типов зрителей. Как этот пример.

Надеюсь, это поможет вам решить вашу проблему.

Ответ 2

вот образец Json для вас, все, что вам нужно сделать, это сохранить и извлечь ваши данные таким образом, запустить этот образец в Json viewer и посмотреть структуру.!

для SQLIte

public static final String TABLE_NAME = "companies_dates";
public static final String COLUMN_TIMESTAMP = "timestamp"; //primary key
public static final String COLUMN_ID = "id";// primary key



public static final String TABLE_NAME = "companies";

public static final String COLUMN_ID = "id";// primary key
public static final String COLUMN_ID_PARENT = "id_parent"; //foreign key //primary key form table companies_dates
 //or use date as parent_date
public static final String COLUMN_DATE_PARENT = "timestamp";
public static final String COLUMN_TITLE = "company";
public static final String COLUMN_TIMESTAMP = "timestamp";  

//ResponseMain.Java

 public  class  CompaniesResponse{

        ArrayList<Companies> companiesList;

        public ArrayList<Companies> getCompaniesList() {
            return companiesList;
        }

        public void setCompaniesList(ArrayList<Companies> companiesList) {
            this.companiesList = companiesList;
        }
    }

    public  class Companies{


        private String timeStamp;
        ArrayList<CompaniesItem> companiesArrayList;

        public String getTimeStamp() {
            return timeStamp;
        }

        public void setTimeStamp(String timeStamp) {
            this.timeStamp = timeStamp;
        }

        public ArrayList<CompaniesItem> getCompaniesArrayList() {
            return companiesArrayList;
        }

        public void setCompaniesArrayList(ArrayList<CompaniesItem> companiesArrayList) {
            this.companiesArrayList = companiesArrayList;
        }
    }

    public class  CompaniesItem{

        private String title;
        private String id;
        private String timeStamp;
        private String parentId;
        private String parentTimeStamp;

        //getter setters

    }


   @Override
    public void onCreate(Bundle savedInstanceState) {
        //super.onCreate(savedInstanceState);


        CompaniesResponse companiesResponse = new CompaniesResponse();

        Companies companies = new Companies();
       // CompaniesItem companiesItem = new CompaniesItem();

        //companiesItem.setId("1");
       // companiesItem.setTimeStamp("Time Stamp");
      //  ArrayList<CompaniesItem> companiesItemArrayList = new ArrayList<>();
       // companiesItemArrayList.add(companiesItem);

         companiesItemArrayList.add(myDb.getAllCompany());

        companies.setTimeStamp(myDb.getDate());
        companies.setCompaniesArrayList(companiesItemArrayList);

        ArrayList<Companies> companieslist = new ArrayList<>();

        companieslist.add(companies);

        companiesResponse.setCompaniesList(companieslist);


    }

для Json

{
 "companies ": [

{
  "date": "12-08.2018",
  "companiesList": [
    {
      "title": "Atmel Corporation",
      "date": "11/11/2017 3:46 PM"
    },
    {
      "title": "Ketul Inc.",
      "date": "11/11/2017 3:46 PM"
    }
  ]
},
{
  "date": "09/19/2017 8:46 PM",
  "companiesList": [
    {
      "title": "Huron Capital Partners LLC",
      "date": "15-06-2018"
    },
    {
      "title": "ABC Technologies",
      "date": "09/12/2017 7:41 PM"
    }
  ]
}


]


}

Ответ 3

Создайте два разных ViewHolder и выполните их по условию, например, как просмотр ресайклеров в чате, как в этом примере. в твоем случае:

  1. создать переменную String date = ""
  2. затем проверьте, что заголовок заголовка поля равен, если не отображает заголовок заголовка, и обновляет дату до varibale (1-й раз не соответствует дате, поэтому покажите headerview)
  3. если встретить совпадение даты list_header_item_view
    public int getItemViewType(int position) {
            UserMessage message = (UserMessage) mMessageList.get(position);

            if (message.getSender().getUserId().equals(SendBird.getCurrentUser().getUserId())) {
                // If the current user is the sender of the message
                return VIEW_TYPE_MESSAGE_SENT;
            } else {
                // If some other user sent the message
                return VIEW_TYPE_MESSAGE_RECEIVED;
            }
        }


    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view;

            if (viewType == VIEW_TYPE_MESSAGE_SENT) {
                view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_message_sent, parent, false);
                return new SentMessageHolder(view);
            } else if (viewType == VIEW_TYPE_MESSAGE_RECEIVED) {
                view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_message_received, parent, false);
                return new ReceivedMessageHolder(view);
            }

            return null;
        }

Ответ 4

если я правильно вас понимаю, ваша задача - запросить SQLite db, сгруппировать записи в даты и отобразить их в разделах в представлении.

Взгляните на это:

public String formatDate(long dateTime) {
    String formatedDate;
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(dateTime);
    Date mDate = calendar.getTime();
    SimpleDateFormat sdf;
    sdf = new SimpleDateFormat("EEEE dd EEEE", new Locale("en"));
    formatedDate = sdf.format(mDate);
    return formatedDate;
} 

SQLiteDatabase db = this.getReadableDatabase(); 
//select companies, order record by date-time created desc (or asc)
Cursor cursor = db.query(Company.TABLE_NAME, null, null,
        null, null, null, DatabaseHelper.KEY_CREATED_AT + " DESC", null);
String day="";
ArrayList<Company> childList= new ArrayList<Company>();
int index = 0;
ArrayList<CompanySectionHeader> sectionHeaders = new ArrayList<>();
if (cursor.moveToFirst()){
      //assign the formatted current date to a variable

     day = formatDate(cursor.getString(cursor.getColumnIndex(DatabaseHelper.KEY_CREATED_AT)));
     String current_day = formatDate(cursor.getString(cursor.getColumnIndex(DatabaseHelper.KEY_CREATED_AT)));
     while(cursor.moveToNext()){
          current_day = formatDate(cursor.getString(cursor.getColumnIndex(DatabaseHelper.KEY_CREATED_AT)));
          childList.add(new Company(cursor.getColumnIndex(DatabaseHelper.KEY_COMPANY_NAME), getFromatDate(cursor.getString(cursor.getColumnIndex(DatabaseHelper.KEY_CREATED_AT))));
          //compare with day var
          if(!day.equals(current_day)) {
             //We are beginning a new day, so add the previous days company to the sectioned list
             sectionHeaders.add(new CompanySectionHeader(new ArrayList<Company>(childList), day, ++index));
             day=current_day; //this is 
             childList.clear();
          }
      }
}
cursor.close();
db.close();
//attach sectionHeaders to view here

Я надеюсь, что это помогает.