Android应用程序中的适配器问题

时间:2011-07-20 09:03:17

标签: android adapter

我在android中有一个应用程序,我从facebook(某些名称和id)返回一些数据,在我返回此数据后,我使用适配器在列表视图中设置所有这些名称。 所有这些工作我都是在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);

  }

/ 以下是从Facebook返回某些数组中的名称的SampleRequestListener /

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扩展了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 :(得分:0)

使用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