android 粘性view_android - 如何在RecyclerView中制作粘性标头? (有或没有外部库) - SO中文参考 - www.soinside.com...

我正在使用room db,我有一张桌子,可以从其中获取LiveData列表。在该表中,有一个“日期”列,用于存储当前日期。当前日期默认为选中状态,但是在数据库中插入数据时,用户也可以更改日期。

我想以这种方式在recyclerview中显示此数据https://imgur.com/RYegFpG

我想根据月份和年份作为标题并将其下的该月份年份的所有条目按照该数据进行分段。

例如,用户在2019年10月插入了数据,我希望此“ October 2019”作为recyclerview中的标题以及该月下的所有条目。就像这样,所有月份的条目都应以相同的方式显示,因为下个月成为标题,而该月份的条目位于标题下方。

我已经尝试通过这样做来实现if (!thisDate.equals(dBDate))

{

holder.transMonthWrapper.setVisibility(View.VISIBLE);

if (IEList.getType().equalsIgnoreCase("income"))

{

String amount = ""+IEList.getAmount();

holder.tvTransAmount.setText(amount);

holder.tvTransAmount.setTextColor(Color.GREEN);

holder.tvTransCategory.setText(IEList.getCategory());

holder.tvTransCategory.setTextColor(Color.GREEN);

}

else

{

String amount = ""+IEList.getAmount();

holder.tvTransAmount.setText(amount);

holder.tvTransAmount.setTextColor(Color.RED);

holder.tvTransCategory.setText(IEList.getCategory());

holder.tvTransCategory.setTextColor(Color.RED);

}

thisDate = dBDate;

holder.tvTransMonth.setText(thisDate);

}

else

{

holder.transMonthWrapper.setVisibility(View.GONE);

if (IEList.getType().equalsIgnoreCase("income"))

{

String amount = ""+IEList.getAmount();

holder.tvTransAmount.setText(amount);

holder.tvTransAmount.setTextColor(Color.GREEN);

holder.tvTransCategory.setText(IEList.getCategory());

holder.tvTransCategory.setTextColor(Color.GREEN);

}

else

{

String amount = ""+IEList.getAmount();

holder.tvTransAmount.setText(amount);

holder.tvTransAmount.setTextColor(Color.RED);

holder.tvTransCategory.setText(IEList.getCategory());

holder.tvTransCategory.setTextColor(Color.RED);

}

}

但是此代码中的问题是,当用户从设置中更改月份并将某些条目放入数据库时​​,该年份的月份条目已经存在于recyclerview中。它在recyclerview中创建该现有月份的另一个标题。但是我希望这将这些条目放入现有的月份标题中,而不是创建该月份的新标题。

在不使用外部库的情况下实现此目标的最佳方法是什么,因为在这种情况下,我不想依赖外部库。

我是编程新手。

更新

活动中public void getTransactionData()

{

adapter = new TransactionAdapter();

recyclerView.setAdapter(adapter);

incomeExpenseModel = ViewModelProviders.of(AllTransaction.this).get(IncomeExpenseViewModel.class);

incomeExpenseModel.getIncomeExpenseData().observe(this, new Observer>() {

@Override

public void onChanged(List incomeExpenses) {

adapter.setIncomeExpenseList(incomeExpenses);

}

});

在回收站适配器中public void onBindViewHolder(@NonNull TransactionViewHolder holder, int position) {

IncomeExpense IEList = incomeExpenseList.get(position);

preferences = context.getSharedPreferences(settingPref, Context.MODE_PRIVATE);

String dateFormat = preferences.getString("Date_Format", "MM.dd.yy");

int lastIndex = incomeExpenseList.size() - 1;

IncomeExpense IELastIndex = incomeExpenseList.get(lastIndex);

String dateFrmDb= IELastIndex.getDate();

DateFormat df=new SimpleDateFormat(dateFormat);

Date d;

try {

d = df.parse(dateFrmDb);

df=new SimpleDateFormat("MMMM yyyy");

if (d != null) {

dBDate = df.format(d);

}

} catch (ParseException e) {

Toast.makeText(context, "Error" +e, Toast.LENGTH_SHORT).show();

}

if (!thisDate.equals(dBDate))

{

holder.transMonthWrapper.setVisibility(View.VISIBLE);

if (IEList.getType().equalsIgnoreCase("income"))

{

String amount = ""+IEList.getAmount();

holder.tvTransAmount.setText(amount);

holder.tvTransAmount.setTextColor(Color.GREEN);

holder.tvTransCategory.setText(IEList.getCategory());

holder.tvTransCategory.setTextColor(Color.GREEN);

}

else

{

String amount = ""+IEList.getAmount();

holder.tvTransAmount.setText(amount);

holder.tvTransAmount.setTextColor(Color.RED);

holder.tvTransCategory.setText(IEList.getCategory());

holder.tvTransCategory.setTextColor(Color.RED);

}

thisDate = dBDate;

holder.tvTransMonth.setText(thisDate);

}

else

{

holder.transMonthWrapper.setVisibility(View.GONE);

if (IEList.getType().equalsIgnoreCase("income"))

{

String amount = ""+IEList.getAmount();

holder.tvTransAmount.setText(amount);

holder.tvTransAmount.setTextColor(Color.GREEN);

holder.tvTransCategory.setText(IEList.getCategory());

holder.tvTransCategory.setTextColor(Color.GREEN);

}

else

{

String amount = ""+IEList.getAmount();

holder.tvTransAmount.setText(amount);

holder.tvTransAmount.setTextColor(Color.RED);

holder.tvTransCategory.setText(IEList.getCategory());

holder.tvTransCategory.setTextColor(Color.RED);

}

}

}

@Override

public int getItemCount() {

return incomeExpenseList.size();

}

public void setIncomeExpenseList(List incomeExpenseList)

{

this.incomeExpenseList = incomeExpenseList;

notifyDataSetChanged();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值