0

カスタムリストビューでの画像の読み込みについて、ここや他の場所でたくさんのスレッドを読みましたが、どこにも行きませんでした!だから、聞いたほうがいいと思いました!

状況は次のとおりです。

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)を配置して、ロード操作が完了するのを待ちました。しかしもちろん、それは受け入れられる解決策ではありません!

:(何か提案はありますか?!私はそのことに一日中費やしました!!!!事前にたくさんありがとう!

4

0 に答える 0