0

これは私が今まで見つけた中で最も奇妙なバグであり、修正することはできません。アプリケーションを実装するために android-binding という外部ライブラリを使用しています。このライブラリの開発者の 1 人に連絡しました。彼は私のプロジェクトをデバッグしましたが、バグは彼のライブラリとは関係がないと考えています。

特定の月のタスクを表示する ListView があります。ビューには、前月のタスクをロードするためのボタン (以降、LoadPrevious) と、翌月からのタスクをロードするためのフッター (以降、LoadNext) があります。この外部ライブラリを使用すると、レイアウト ビューで属性 binding:onclick を設定できるため、ユーザーがビューをクリックすると、コードに配置された Command が自動的に呼び出されます。

LoadNext をクリックすると、関数は最初から正常に動作します。これ以降、LoadNext をクリックするたびに何も実行されず、関数は呼び出されません。次に LoadPrevious をクリックすると、LoadNext で行ったすべてのクリックが実行されます。たとえば、クリックが積み重ねられた場合などです。

しかし、それはもっと奇妙になります。リストの項目をクリックすると (onClick 関数は何もする必要がなく、項目をクリックするだけです)、LoadNext は正常に動作します。コード (ListView->performItemClick、setSelection、setChecked) からクリックをシミュレートしようとしましたが、まだ機能していません。

ビューのクリックが積み重なる理由があるかどうか、誰かが知っていますか?

編集: プロジェクト コードは単純ではありません。失敗した機能に関連するコードをここに配置し、このアクティビティの他のすべての機能をスキップしますが、これらの機能の他のいくつかがエラーに関係している可能性があると思います.

これは、機能していないコマンドのコードです。

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() 関数から機能します。しかし、その行のコメントを外してビューからタブを削除すると (レイアウトには 2 つのタブがあり、2 つ目のタブにはリストがあります)、それも機能します。つまり、両方 (タブと setCursor) を使用すると機能しませんが、どちらかを削除すると機能します。

しかし、それだけではありません。タブと setCursor を使用してプロジェクトで簡略化されたバージョンを作成しましたが、リストにコンテキスト メニューがなく、レイアウトにオプション メニューがなく、バックグラウンドで実行されている SyncAdapter もありません。このエラーは、一連のものが連携しているときにのみ発生するようで、そのうちの 2 つは setCursor とタブです。私が言ったように、私が今まで見つけた中で最も奇妙なバグです。

4

0 に答える 0