2016-09-17 57 views
-1

我有一个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语句检查值,但是当我运行它时,它崩溃。我之前没有'else if'的陈述,但是我希望这会有助于崩溃,一个else语句应该可以正常工作。

无论如何,我调试它并逐步观察它,程序似乎发现第一条语句是正确的,然后它会执行语句中的所有内容,包括'return 2;'然而之后它只是跳过返回0,这会导致崩溃,如果我没有其他的话,那么它会直接跳到else语句并返回1,同样会导致它崩溃。

编辑:修复了else if混淆问题的声明。

进一步编辑:因为混乱是不固定的,这里是我的意思https://gyazo.com/06d2de58e7c170f0cbbf1a4e58be7ca3

+1

您需要发布一个堆栈跟踪或更多的代码,这是好的。 – mikeb

+0

你需要检查(mTransactions == null)和if(mTransactions.get(mTransactionPosition)== null) –

+0

@DominiqueLorre我看着调试器经过它,这两个语句都不是真的。它从字面上读取if语句是正确的,进入返回2行然后继续到else并返回该值。 –

回答

0

尝试使用而不是多个开关,如果其他人如果GIF:反正 一旦返回1,执行后的代码部分是死代码所以它不会执行..您可以使用continue和break语句来控制条件语句
请添加您的异常/ logcat。

0

那么,第一个问题,你没有得到正确的ifelse if概念。当if条件一旦返回true时,其他if不被检查。

而第二个问题

一个函数只能返回一次。你明确返回return 0这是无效的。所以,你的程序崩溃了。

有一个好时机

+0

正如我在问题中提到的那样,我知道如何使用else,我只是试图解决这个问题,原来的代码只是因为它或者它不是,但它总是会进入else语句中如果if语句是真的,并且我看过调试程序通过if语句到return 2字段,然后到else语句。 –

+0

你刚刚编辑你的代码。 –

+0

我刚才告诉你因为你的代码崩溃的原因 –

0

您需要在范围0返回视图类型为int到的观看次数 - 1

@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; 
    } 
} 

编辑:另外,你不使用的位置在你的方法。 AdapterView需要向前和向后滚动,并以任何顺序访问视图。我不知道你是怎样用这种方法外管理的东西,但它看起来像你期望的适配器依次遍历...

ANOTHER编辑:这将在其他地方需要在适配器中的变化:

@Override 
public int getItemViewType(int position) { 
    SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd"); 
    if (position == 0 || !fmt.format(mTransactions.get(position).getTime() 
      .equals(fmt.format(mTransactions.get(position - 1).getTime())) { 
     // First transaction on this date (probably want to give it a header?) 
     return 1; 
    else { 
     // transaction on same date as previous in list 
     return 0; 
    } 
} 

FINAL EDIT:因为你想要的DateViews不是列表中的元素,所以我建议完全忘记getItemViewType()。给你的交易视图一个标题相当于你的日期视图与一个ID,所以你可以设置可见性GONE或VISIBLE。

然后在onBindViewHolder():

SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd"); 
if (position == 0 || !fmt.format(mTransactions.get(position).getTime() 
     .equals(fmt.format(mTransactions.get(position - 1).getTime())) { 
    // First transaction on this date (probably want to give it a header?) 
    holder.heading.setVisibility(View.VISIBLE); 
    holder.heading.setText(fmt.format(mTransactions.get(position).getTime()); 
else { 
    // transaction on same date as previous in list 
    holder.heading.setVisibility(View.GONE); 
} 
// Fill in other details of TransactionView here 
+0

没有工作。不过谢谢。检查问题中的gif,应该更好地解释。 –

+0

使用实际位置的问题是,它背后的想法意味着将有多个交易,并且这些日子将分开,因此,例如,如果我在16日做了,那么会有一个DateViewHolder来显示这个。但是,这可能会破坏基于位置的访问交易信息的系统。因此,我有一个只在创建transactionViewHolder时递增的transactionPosition字段。所以这个位置不会搞乱mTransactions数组。 –

+0

但是当你向后滚动列表时会发生什么? –