カスタムリストビューでの画像の読み込みについて、ここや他の場所でたくさんのスレッドを読みましたが、どこにも行きませんでした!だから、聞いたほうがいいと思いました!
状況は次のとおりです。
6つのアイテム(Item1、Item2など)のリストビューがあるアクティビティがあります。ユーザーがアイテムをクリックすると、別のリストビューで新しいアクティビティを起動しますが、今回のリストビューは、画像とテキストを含むカスタムビューです。
最初のアクティビティのonCreateメソッドは次のとおりです。
GetImageFromURL eventImageLoader = new GetImageFromURL(FirstActivity.this, eventMultimediaID);
eventImageLoader.execute();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
CustomAdapter adapter = new CustomAdapter(this, android.R.layout.simple_expandable_list_item_1, R.id.textView1, eventName, bitmap);
eventList = (ListView) findViewById(R.id.secEventList);
eventList.setAdapter(adapter);
eventList.setOnItemClickListener(eventNameListClickListener);
AsyncTaskを作成して開始し、画像をビットマップリストにロードします。
eventMultimediaIDは文字列配列であり、eventNameも同様です。
GetImageFromURLタスクは次のとおりです。
public class GetImageFromURL extends AsyncTask<Void, Void, List<Bitmap>>
{
private ProgressDialog progressDialog = null;
private Context callingContext = null;
private List<Bitmap> bitmap = new ArrayList<Bitmap>();
private String[] eventMultimediaID = null;
public GetImageFromURL(Context callingContext, String[] eventMultimediaID)
{
this.callingContext = callingContext;
this.eventMultimediaID = eventMultimediaID;
}
@Override
protected void onPreExecute()
{
super.onPreExecute();
progressDialog = ProgressDialog.show(callingContext, "Loading Events", "Retrieving data from server, please wait...", true);
}
@Override
protected List<Bitmap> doInBackground(Void... params)
{
try
{
int length = eventMultimediaID.length;
for(int i = 0; i < length; i++)
{
URL imageUrl = new URL("https://www.blahblah/servlet?blahblah=" + eventMultimediaID[i]);
bitmap.add(i, BitmapFactory.decodeStream(imageUrl.openConnection().getInputStream()));
}
}
catch (IOException e)
{
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPostExecute(List<Bitmap> bitmap)
{
for(int i = 0; i < bitmap.size(); i++)
{
ShowEventCategory.bitmap.add(i, bitmap.get(i));
}
progressDialog.dismiss();
}
}
これはCustomAdapterです:
public class CustomAdapter extends ArrayAdapter<String>
{
private Context currentContext;
private String[] data;
private List<Bitmap> evImage;
public CustomAdapter(Context context, int resource, int textViewResourceId, String[] objects, List<Bitmap> bitmap)
{
super(context, resource, textViewResourceId, objects);
this.currentContext = context;
this.data = objects;
this.evImage = bitmap;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
LayoutInflater inflater = (LayoutInflater) currentContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View eventListItem = inflater.inflate(R.layout.show_event_category_list_item, parent, false);
ImageView eventListItemImage = (ImageView) eventListItem.findViewById(R.id.eventImage);
TextView eventListItemText = (TextView) eventListItem.findViewById(R.id.eventText);
eventListItemText.setText(data[position]);
eventListItemImage.setImageBitmap(evImage.get(position));
return eventListItem;
}
}
私がやろうとしたのは、アクティビティから非同期タスクを呼び出して画像をロードし、その間にロードダイアログを表示することでした。ロードが完了すると、ダイアログが閉じられ、アダプタは入力されたビットマップ配列を取得します。
これは機能しません。タスクが開始された後、実行が続行され(これが発生する必要があると思います)、アダプターが空の配列を取得するため、OutOfBoundsExceptionが発生します。そのため、メインスレッドにThread.sleep(5000)を配置して、ロード操作が完了するのを待ちました。しかしもちろん、それは受け入れられる解決策ではありません!
:(何か提案はありますか?!私はそのことに一日中費やしました!!!!事前にたくさんありがとう!