【问题标题】:How to load asynchronous data into a GridView?如何将异步数据加载到 GridView 中?
【发布时间】:2014-02-11 22:01:52
【问题描述】:

我正在使用 AsyncTask 从网络上检索图片的 String[],效果很好。

问题是当我尝试加载GridView Adapter时,数据还没有到达。所以,此时的arraynull。在我实例化GridView 时,如何确保String[] 包含数据?

这里是onCreate()

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sample_grid_view);

     Bundle extras = getIntent().getExtras();
     if (extras != null) {
         query = extras.getString("query");
     }

     new AsyncDownload().execute();

    GridView gv = (GridView) findViewById(R.id.grid_view);
    gv.setAdapter(new SampleGridViewAdapter(this));
    gv.setOnItemClickListener(new AdapterView.OnItemClickListener(){

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Toast.makeText(getApplicationContext(), "You have touched picture number " + String.valueOf(position) , Toast.LENGTH_SHORT).show();

    }

    });
}

这里是Adapter(请看关于图片的评论)

final class SampleGridViewAdapter extends BaseAdapter {
  private final Context context;
  private final List<String> urls = new ArrayList<String>();

  public SampleGridViewAdapter(Context context) {
    this.context = context;
//In this line is where I call the images retrieved by the AsyncTask. 
//After finishing and opening the activity again, the images will be there, and will load correctly.
    Collections.addAll(urls, SampleGridViewActivity.returnImages());
    Collections.shuffle(urls);

  }

  @Override public View getView(int position, View convertView, ViewGroup parent) {
    SquaredImageView view = (SquaredImageView) convertView;
    if (view == null) {
      view = new SquaredImageView(context);
      view.setScaleType(CENTER_CROP);
    }

    // Get the image URL for the current position.
    String url = getItem(position);

    // Trigger the download of the URL asynchronously into the image view.
    Picasso.with(context) //
        .load(url) //
        .placeholder(R.drawable.placeholder) //
        .error(R.drawable.error) //
        .fit() //
        .into(view);

    return view;
  }

  @Override public int getCount() {
    return urls.size();
  }

  @Override public String getItem(int position) {
    return urls.get(position);
  }

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

}

谢谢

【问题讨论】:

    标签: android gridview android-asynctask


    【解决方案1】:

    您可以在没有任何内容的情况下实例化适配器。只需在构造函数中实例化 urls 集合,您不必在创建时向其添加任何内容。在您提供之前,它不会显示任何内容.. 只需添加一个名为 addData() 的方法,该方法会将您加载的数据作为参数,并将此数据添加到适配器中的集合中。然后你必须调用适配器的notifyDatasetChanged() 方法,它会告诉它它应该用新的内容重新查询 GridView..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-14
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多