Динамический раздел заголовка RecyclerView с использованием текущей даты и времени
Я буду использовать RecyclerView для заголовка раздела
Я хочу создать заголовок раздела, когда я вставляю данные Date & Time в SQLite Database
Я следил за ссылками для этого решения, но не был успешным
Пожалуйста, обратитесь к приведенному ниже изображению
Для данных вышеприведенного изображения с использованием приведенного ниже кода ИЛИ Раздел является статическим:
List<Company> childList = new ArrayList<>();
List<CompanySectionHeader> sectionHeaders = new ArrayList<>();
childList = myDb.getAllCompany();
sectionHeaders.add(new CompanySectionHeader(childList, "WEDNESDAY 4 APRIL", 1));
Теперь Если предположить, что я ввожу сегодня данные, тогда я создаю 1 заголовок раздела, принимающий сегодня дату
Под заголовком раздела данных изображения ниже Static или данные также:
Над данными изображения получают использование ниже кода:
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.
Для этого вам нужно использовать что-то вроде 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 и выполните их по условию, например, как просмотр ресайклеров в чате, как в этом примере. в твоем случае:
- создать переменную String date = ""
- затем проверьте, что заголовок заголовка поля равен, если не отображает заголовок заголовка, и обновляет дату до varibale (1-й раз не соответствует дате, поэтому покажите headerview)
- если встретить совпадение даты 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
Я надеюсь, что это помогает.