(スペルの間違いをお詫びします)
いくつかの組み合わせに問題があります:
GridView を使用して、データベースからショーのコンテンツをダウンロードします。onClick 後で表示できるファイルがダウンロードされます。その約20MB。このダウンロードはサービスによって行われます。
gridView のすべての項目には、レイアウトに進行状況バーが含まれています。このプログレスバーは、アイテムがサービスを介してバックグラウンドでダウンロードされている場合にのみ表示されます。
サービスは、ダウンロードの進行状況に関するブロードキャストを送信します。インテントには、グリッドビューのアダプターのデータでアイテムを見つけるためのアイテムの ID が含まれています。
アクティビティに BroadcastReceiver が登録され、gridview-adapter の関数「setProgress」を呼び出す Progress Update を取得します (同時ダウンロードが可能であることを忘れないでください)。
public void setProgress(long id, int progress)
{
for (int i = 0;i < list.size();i++)
{
if (list.get(i).getId() == id)
{
list.get(i).setProgress(progress);
notifyDataSetChanged();
}
}
}
この時点まで、すべてが正常に機能します。
さらに、http://www の QuickAction 実装を使用しています。londatiga.net/it/how-to-create-quickaction-dialog-in-android/ (2 つ以上のハイパーリンクを投稿できないためスペース)
問題は次のとおりです。
notifydatasetchanged が呼び出され、ユーザーがアイテムをタップすると、クイックアクションが間違った位置に表示されることがあります。
これを明確にするために、ここに2つの写真があります:
最初のものは何が起こるべきかです (この場合、グリッドビューの最初の項目をクリックします) http://dl.dropbox.com/u/9031500/expected.png
2 番目の図は、時々何が起こるかを示しています (一部のダウンロードが実行されている場合のみ、「notifydatasetchanged」とビューの再構築が原因であると推測されます)。これも最初のアイテムのクリックでしたが、残念ながらクイック アクションは 4 番目のアイテムに表示されます: http://dl.dropbox.com/u/9031500/wrong.png
これは、クイックアクションを呼び出すためのアクティビティでの実装です。
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
showQuickAction(view, position);
}
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
showQuickAction(view, position);
return true;
}
private void showQuickAction(View view, int position)
{
RelativeLayout facsimile = (RelativeLayout) view.findViewById(R.id.lib_item_image_layout);
Log.i(LOGTAG, "Position:"+position);
currentPaper = TZReader.paperDao.load(libraryAdapter.getItemId(position));
Log.i(LOGTAG,"Set CurrentPaper:"+currentPaper.getTitelWithDate());
ActionItem downloadItem = new ActionItem(ACTION_ITEM_DOWNLOAD, "Download", getResources().getDrawable(R.drawable.ic_action_download));
ActionItem readItem = new ActionItem(ACTION_ITEM_READ, "Lesen", getResources().getDrawable(R.drawable.ic_action_read));
ActionItem deleteItem = new ActionItem(ACTION_ITEM_DELETE, "Löschen", getResources().getDrawable(R.drawable.ic_action_delete));
ActionItem cancelItem = new ActionItem(ACTION_ITEM_CANCEL, "Abbrechen", getResources().getDrawable(R.drawable.ic_action_cancel));
QuickAction mQuickAction = new QuickAction(this, QuickAction.HORIZONTAL);
switch (currentPaper.getState())
{
case Paper.DOWNLOADED_READABLE:
mQuickAction.addActionItem(readItem);
mQuickAction.addActionItem(deleteItem);
break;
case Paper.DOWNLOADED_BUT_UPDATE:
mQuickAction.addActionItem(downloadItem);
mQuickAction.addActionItem(deleteItem);
break;
case Paper.IS_DOWNLOADING:
mQuickAction.addActionItem(cancelItem);
break;
case Paper.NOT_DOWNLOADED:
mQuickAction.addActionItem(downloadItem);
break;
}
//Set listener for action item clicked
mQuickAction.setOnActionItemClickListener(new QuickAction.OnActionItemClickListener() {
@Override
public void onItemClick(QuickAction source, int pos, int actionId) {
//here we can filter which action item was clicked with pos or actionId parameter
switch(actionId)
{
case ACTION_ITEM_DOWNLOAD:
Intent downloadIntent = new Intent(getApplicationContext(), DownloadService.class);
downloadIntent.putExtra(DownloadService.PARAMETER_PAPER_DB_ID_LONG, currentPaper.getId());
startService(downloadIntent);
break;
case ACTION_ITEM_READ:
break;
case ACTION_ITEM_DELETE:
DeleteAlertDialogFragment newFragment = DeleteAlertDialogFragment.newInstance(currentPaper.getId());
newFragment.setStyle(SherlockDialogFragment.STYLE_NO_TITLE,0);
newFragment.show(getSupportFragmentManager(), "dialog");
break;
case ACTION_ITEM_CANCEL:
break;
}
}
});
mQuickAction.show(facsimile);
}
たぶん、誰かが私がこの問題を処理する方法について何か考えやヒントを持っているでしょう! 100万前もってありがとう!