У меня есть приложение на 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[]
не возвращаются вовремя фоновым потоком, поэтому они все еще пусты, когда я пытаюсь работать с адаптером на них.
Так может кто-нибудь сказатькак мне поступить, чтобы эта штука работала правильно? Спасибо