Реализация GalleryAdapter getCount, который получает свой контент с удаленного сервера - PullRequest
0 голосов
/ 01 июля 2011

Это простое объяснение, но, пожалуйста, потерпите меня ... Вот драконы ...

Хорошо, у меня есть галерея Android и я реализовал GalleryAdapter, который создает мои представления и прочее:

public class GalleryAdapter extends BaseAdapter {....
....
etc
...

Теперь, прежде чем мы начнем, почти ВСЕ примеры, показывающие, как это сделать, предполагают, что вы точно знаете, сколько изображений будет в галерее.В моем случае у меня нет.Это может быть любое произвольное количество изображений, но, по крайней мере, существует согласованное соглашение об именах, например 001, 002, 003 и т. Д.

У меня есть папка где-то на сервере, на которой есть изображения, которые должны отображаться в галерее.:

http://www.somedomain.com/content/pictures

В этой папке изображений у нас может быть
0001.jpg
0002.jpg
0003.jpg
000n.jpg
и т.д. до бесконечности

Теперь BaseAdapter, который я расширяю, ожидает от вас переопределения public int getCount()
Так что, если вы знаете, что у вас есть 20 изображений, вы просто идете:

public int getCount() {return 20;}  

И вашна вашем веселом пути.Но как насчет моего случая?
То, как я до сих пор обходился, требует, чтобы файл count.txt был помещен в корень этого каталога, где находятся изображения, содержащие целое число, которое говорит вам, что существует X количествоизображения в нем.Помните, что это http расположение.

Так что мой getCount выглядит примерно так

public int getCount() {
  int count = getRemoteImageCount();
  if(count == -1)
  {
      return 0;//Oh crap, something went wrong, what now?!
  } else {
    return count;
  }

public int getRemoteImageCount()
  try {
    URL url = new URL(strURL);
    URLConnection conn = url.openConnection();
    conn.setUseCaches(true);
    conn.connect();

    InputStream instream = conn.getInputStream();
    InputStreamReader reader = new InputStreamReader(instream);

    String strCount = new String();
    int data = reader.read();
    while(data != -1){
      char theChar = (char) data;
      strCount += theChar;
      data = reader.read();
    }

    reader.close(); 
    count = Integer.parseInt(strCount);
    } catch (Exception e) {
      count = -1
  } 


  return count;
}

Хорошо, теперь, когда у нас есть немного контекста, вот актуальный вопрос.Если по какой-то причине мне не удается получить файл count.txt и я не могу определить, сколько изображений находится в удаленной папке, мне нужно сообщить пользователю, что мы не смогли использовать диалог, и спросить его, хотят ли они повторить попытку или просто проигнорировать его.,Как бы я поступил так?Следующий фрагмент кода - моя попытка, но он терпит неудачу по нескольким причинам, но в основном потому, что диалоги отображаются синхронно.Как мне реализовать (Повторить / Отменить), чтобы перевести мой GalleryAdapter в состояние, когда в конечном итоге сеть резервируется, и я могу хранить эти изображения в Галерее?

Вот моя неработающая попытка.Любые альтернативные предложения также приветствуются.

public int getCount() {
    // TODO fetch image amount remotely     
    int imageCount;

    do {
        RemoteBitMapHelper rbmh = new RemoteBitMapHelper();     
        imageCount = rbmh.getBitmapCount(baseUrl + "count.txt");

        if(imageCount == -1) {
            imageCount = 0;
            new AlertDialog.Builder(this.context)
            .setTitle("Connection Error")
            .setMessage("There was an error connecting to the server")
            .setPositiveButton("Retry",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int whichButton) {
                        setRetryGetCount(true);
                    }
                })
            .setNegativeButton("Continue",
                new DialogInterface.OnClickListener() {             
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        setRetryGetCount(false);
                    }
                })
            .setCancelable(false)
            .show();
        }

    } while(retryGetCount && imageCount <= 0);


    return imageCount;
}

1 Ответ

0 голосов
/ 04 июля 2011

Это не идеальная идея.Сначала вы пытаетесь получить количество изображений, а затем попытаться получить изображения.На самом деле, вы должны попробовать этот пример.Хотя он извлекает изображения из внешнего хранилища, но позже вы можете преобразовать его для извлечения изображений с сервера.Я надеюсь, что это поможет вам.

...