0

这是我发现的最奇怪的错误,我无法修复它。我正在使用一个名为 android-binding 的外部库来实现我的应用程序。我联系了这个库的一位开发人员,他调试了我的项目,他认为这个错误与他的库无关。

我有一个 ListView 显示某个月份的任务。该视图有一个按钮用于加载上个月的任务(从现在开始,LoadPrevious)和一个用于从下个月加载任务的页脚(从现在开始,LoadNext)。这个外部库允许您在布局视图上设置属性绑定:onclick,因此当用户单击视图时,它会自动调用放置在代码中的命令。

如果我单击 LoadNext,该功能第一次可以正常工作。从这里开始,每次我单击 LoadNext 时它什么都不做,也不会调用该函数。如果然后我点击 LoadPrevious,我在 LoadNext 上所做的所有点击都会执行,就像点击堆叠或类似的东西一样。

但它变得更加奇怪。如果我单击列表中的一个项目(onClick 函数不需要做任何事情,只需单击该项目)然后 LoadNext 工作正常。我试图模拟来自代码的点击(ListView->performItemClick、setSelection、setChecked),但它仍然无法正常工作。

有谁知道是否有原因导致点击 Views 可能会被堆叠或类似的东西?

编辑:项目代码并不简单。我将在这里放置与失败功能相关的代码,跳过此活动的所有其他功能,尽管我认为其中一些其他功能可能与错误有关。

这是不起作用的命令的代码:

public final CursorCollection<TaskItem> TaskList = new CursorCollection<TaskItem>(TaskItem.class); // Binded to the ListView (like an Adapter). Related to the external library

public final Command LoadNext = new Command(){
    @Override
    public void Invoke(View arg0, Object... arg1){
        monthListEnd++;
        if(monthListEnd==12){
            monthListEnd=0;
            yearListEnd++;
        }
        listTitle=monthName[monthListStart]+" "+yearListStart+" to "+monthName[monthListEnd]+" "+yearListEnd;
        fillList();
    }
};

//Fills the ListView.  
public void fillList(){
        int daysLastMonth = numberOfDays[monthListEnd];
        if(monthListEnd==1 && yearListEnd%4==0 && (yearListEnd%100 != 0 || yearListEnd%400 == 0)) daysLastMonth++;
        Cursor c = model.getTasks(1, monthListStart, yearListStart, daysLastMonth, monthListEnd, yearListEnd);
        if (c.getCount() == 0) ListEmpty.set(true);
        else ListEmpty.set(false);
        mContext.startManagingCursor(c);
        TaskList.setCursor(c);
}

这是 TaskItem 类:

public class TaskItem extends RowModel{ 
    public final StringField Id = new StringField("id"); 
    public final StringField Id_local = new StringField("id_local"); 
    public final StringField Name = new StringField("name"); 
    public final DateField StartDate = new DateField("start_date"); 
    public final DateField EndDate = new DateField("end_date"); 
    public final StringField Status = new StringField("status"); 
}

我发现了一些有趣的事情。如果我评论“TaskList.setCursor(c);”行 从它起作用的 fillList() 函数。但是,如果我取消注释该行并从视图中删除选项卡(布局有两个选项卡,第二个有列表),它也可以工作。也就是说,如果我同时使用这两个东西(选项卡和 setCursor),它就不起作用,但如果我删除其中一个,它就起作用了。

但这还不止于此。我使用带有选项卡和 setCursor 的项目创建了一个简化版本,但列表中没有上下文菜单,布局中没有选项菜单,也没有在后台运行 SyncAdapter,它也可以工作。就像这个错误只发生在一组东西一起工作时,其中两个是 setCursor 和选项卡。就像我说的,我发现的最奇怪的错误。

4

0 回答 0