これは私が今まで見つけた中で最も奇妙なバグであり、修正することはできません。アプリケーションを実装するために 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 とタブです。私が言ったように、私が今まで見つけた中で最も奇妙なバグです。