我有一个Recyclerview,用于显示交易,但按日期分开。但是我的getItemViewType似乎不起作用。这是代码:
@Override
public int getItemViewType(int position) {
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
if (mCompareDate == null || !fmt.format(mTransactions.get(mTransactionPosition).getTime()).equals(fmt.format(mCompareDate))) {
mCompareDate = mTransactions.get(mTransactionPosition).getTime();
return 2;
} else {
return 1;
}
}
我有一个if语句来检查一个值,但是当我运行它时,它会崩溃。我没有其他的“如果'之前的声明,但我希望它能帮助崩溃,否则其他声明应该可以正常工作。
无论如何我调试它并一步一步地观察它,程序似乎发现第一个语句是正确的,它然后在语句中做所有事情,包括'返回2;'但是之后它只是跳过返回0,这会导致崩溃,如果我没有其他的话,那么它会直接跳到else语句并返回1,也会崩溃。
编辑:修复了出现混淆问题的else if语句。
进一步编辑:因为混淆没有解决,这里是我的意思的{gif https://gyazo.com/06d2de58e7c170f0cbbf1a4e58be7ca3
答案 0 :(得分:0)
如果出现以下情况,请尝试使用开关而不是多个if:无论如何
一旦返回1执行后,部分代码就是死代码,所以它不会执行..你可以使用continue和break语句来控制条件语句
添加请发布您的异常/ logcat。
答案 1 :(得分:0)
嗯,第一个问题是,您没有正确获得else if
if
概念。当return 0
条件一旦返回true时,其他如果未被检查。
第二个问题
一个功能只能返回一次。您将在结尾\
显式返回,这是无效的。所以,你的程序崩溃了。
玩得开心
答案 2 :(得分:0)
您需要将范围0中的视图类型int返回到viewCount - 1。
;
编辑:此外,您不在方法中使用位置。 AdapterView需要向前和向后滚动,并以任何顺序访问Views。我不确定你是如何处理这种方法之外的事情,但看起来你期望适配器顺序迭代......
另一个编辑:这将需要更改适配器中的其他位置:
for(i=0;i<n;i++);
最终编辑:因为你想要的DateViews不是List中的元素,所以我建议完全忘记getItemViewType()。使用id为您的TransactionView提供与DateView相当的标题,这样您就可以将可见性设置为GONE或VISIBLE。
然后在onBindViewHolder():
@Override
public int getItemViewType(int position) {
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
if (mCompareDate == null || !fmt.format(mTransactions.get(mTransactionPosition).getTime()).equals(fmt.format(mCompareDate))) {
mCompareDate = mTransactions.get(mTransactionPosition).getTime();
return 1;
} else {
return 0;
}
}