проблема с адаптером в приложении для Android - PullRequest
0 голосов
/ 20 июля 2011

У меня есть приложение на Android, в котором я возвращаю некоторые данные из facebook (некоторые имена и идентификаторы), и сразу после возвращения этих данных я использую адаптер, чтобы установить все эти имена в виде списка.Всю эту работу я делаю в onCreate(). Впервые я использую метод getData(), чтобы вернуть некоторые имена из Facebook, и после этого я вызываю адаптер.

Проблема в том, что getData() возвращается вarray строк имен, которые будут настроены с помощью адаптера. Теперь вызываемый адаптер выполняет некоторую обработку этого массива.

Как я возвращаю эти имена из сети, эта часть работает медленно, и массивне заполнен во времени, поэтому, когда адаптер вызывается, массив все еще пуст, и я получаю принудительное закрытие.

Вот как я это делаю:

private String[] mStrings;
private String[] fName;
public void onCreate(Bundle savedInstanceState)
{
        super.onCreate(savedInstanceState);
       setContentView(R.layout.invitefriends);

        ....................
   /*In here I request for friends from facebook which ae set up in an array*/
     mAsyncRunner.request("me/friends", new SampleRequestListener());

  /*here is the adapter that processes the arrays returned in SampleRequestListener*/

    adapter=new LazyAdapter1(this, mStrings,fName);
     list.setAdapter(adapter);

  }

/ ВотSampleRequestListener, который возвращает из facebook имена в некоторых массивах /

public class SampleRequestListener extends BaseRequestListener{
    int i;
    public void onComplete(final String response, final Object state){
        friends = new ArrayList<Friends>();
        try{
            Log.d("facebook-example","Response: " + response.toString());
            JSONObject json = Util.parseJson(response);
            JSONArray array = json.optJSONArray("data");


            if(array!=null){
                for(int i=0; i<array.length(); i++)
                {
                    String name=array.getJSONObject(i).getString("name");
                    String id= array.getJSONObject(i).getString("id");
                    Friends f=new Friends(name,id);
                    friends.add(f);
                    Log.d(name,id);
                }
                   mStrings = new String[friends.size()];
                    for(int i=0; i< mStrings.length; i++){
                        mStrings[i] = "http://graph.facebook.com/"+friends.get(i).getId()+"/picture?type=small";
                    }
                    fName = new String[friends.size()];
                    for(int i=0; i<friends.size(); i++)
                    {
                        fName[i]=friends.get(i).getName();
                    }

            }
        }
        catch(JSONException e)
        {
            //do nothing
        }
        catch(FacebookError e)
        {
            e.getMessage();
        }
    }
}

И, наконец, вот тело адаптера:

открытый класс LazyAdapter1 extends BaseAdapter {

private Activity activity;
private String[] data;
private String[] nume;
private static LayoutInflater inflater=null;
public ImageLoader imageLoader; 

public LazyAdapter1(Activity a, String[] d, String[] f) {
    activity = a;
    data=d;
    nume=f;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    imageLoader=new ImageLoader(activity.getApplicationContext());
}

public int getCount() {
    return data.length;
}

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}

public static class ViewHolder{
    public TextView text;
    public ImageView image;
}

public View getView(int position, View convertView, ViewGroup parent) {
    //........
}

}

Проблема в том, что mStrings[] и fName[] не возвращаются вовремя фоновым потоком, поэтому они все еще пусты, когда я пытаюсь работать с адаптером на них.

Так может кто-нибудь сказатькак мне поступить, чтобы эта штука работала правильно? Спасибо

1 Ответ

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

используйте класс AsyncTask и расширяйте свой пользовательский класс.

это было хорошо для получения данных в фоновом процессе.

и, когда данные извлекаются, затем устанавливаются в адаптер

проверьте ссылки

http://www.vogella.de/articles/AndroidPerformance/article.html

http://developer.android.com/reference/android/os/AsyncTask.html

http://www.xoriant.com/blog/mobile-application-development/android-async-task.html

...