如何在onPostexecute AsyncTask中使用gridview [英] how to use gridview in onPostexecute AsyncTask
问题描述
我有以下代码,我想首先从drawable文件夹中加载图像,然后从api中加载图像. 使用getData()方法成功从可绘制文件夹中加载图片, 但我不知道如何从url加载图像并更新gridview .当我在注释行下更新网格时, onPostExecute 方法使应用程序崩溃,这就是为什么我在方法 onPostExecute 方法中注释网格视图代码的原因,请检查并帮助我
i have following code , i want image load first from drawable folder and after api. image successfully load from drawable folder using getData() method, but i don't know how to load image from url and update gridview. onPostExecute method when i update my grid below comment line crash the application that's why i comment my gridview code in method onPostExecute method please check and help me this
我是Android的新手,请显示示例
I am New in Android please show example
public class MainActivity extends AppCompatActivity {
private GridView gridView;
private GridViewAdapter gridAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gridView = (GridView) findViewById(R.id.gridView);
gridAdapter = new GridViewAdapter(this, R.layout.grid_item_layout, getData());
gridView.setAdapter(gridAdapter);
APICaller ob = new APICaller();
ob.execute();
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
ImageItem item = (ImageItem) parent.getItemAtPosition(position);
//Create intent
Intent intent = new Intent(MainActivity.this, abc.class);
intent.putExtra("title", item.getTitle());
intent.putExtra("image", item.getImage());
//Start details activity
startActivity(intent);
}
});
}
/**
* Prepare some dummy data for gridview
*/
private ArrayList<ImageItem> getData() {
final ArrayList<ImageItem> imageItems = new ArrayList<>();
TypedArray imgs = getResources().obtainTypedArray(R.array.image_ids);
for (int i = 0; i < imgs.length(); i++) {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), imgs.getResourceId(i, -1));
imageItems.add(new ImageItem(bitmap, "Image#" + i));
}
return imageItems;
}
private ArrayList<ImageItem> getData(appmodel[] data) {
Toast.makeText(getApplicationContext(),
data.toString(), Toast.LENGTH_LONG).show();
final ArrayList<ImageItem> imageItems = new ArrayList<>();
TypedArray imgs = getResources().obtainTypedArray(R.array.image_ids);
for (int i = 0; i < imgs.length(); i++) {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), imgs.getResourceId(i, -1));
imageItems.add(new ImageItem(bitmap, "Image#" + i));
}
return imageItems;
}
class APICaller extends AsyncTask{
protected void onPostExecute(Object result)
{
String data = (String)result;
Gson g = new Gson();
Type t = new TypeToken<appmodel[]>(){}.getType();
appmodel[] appm = (appmodel[])g.fromJson(data,t);
// gridView = (GridView) findViewById(R.id.gridView);
// gridAdapter = new GridViewAdapter(getApplicationContext(), R.layout.grid_item_layout, getData());
// gridView.setAdapter(gridAdapter);
}
@Override
protected Object doInBackground(Object[] objects) {
HttpClient client = new DefaultHttpClient();
HttpGet getlish = new HttpGet("http://test.abc.com/api/test");
ResponseHandler<String> handler = new BasicResponseHandler();
Object result = new Object();
try {
result = client.execute(getlish,handler);
}
catch(Exception e)
{
}
return result;
}
}
}
当我使用以下方法检查日志时,它会显示json数据
when i check in log using below method its shows json data
protected void onPostExecute(Object result)
{
String data = (String)result;
Log.d("myTag", data);
}
JSON
[ {
"apptype": 1,
"imagename": "test",
"imageurl": "http://test.abc.com/androidimages/test/test.jpg"
}
]
推荐答案
在适配器类中添加这样的新方法
public class GridViewAdapter extends BaseAdapter{
private ArrayList<ImageItem> mItemList;
public void updateItemList(ArrayList<ImageItem> newItemList){
this.mItemList = newItemList;
notifyDataSetChanged();
}
}
和onPostExecute调用此方法并设置新列表.所以您的onPost看起来像这样
and onPostExecute call this methode and set new list. So your onPost looks like this
protected void onPostExecute(Object result)
{
String data = (String)result;
Gson g = new Gson();
Type t = new TypeToken<appmodel[]>(){}.getType();
appmodel[] appm = (appmodel[])g.fromJson(data,t);
gridAdapter.updateItemList(getData());
}
要使用url加载imagview,您可以使用Picasso Library,其外观如下所示
To load imagview using url you can use Picasso Library , for your refrence it looks like this
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
添加以下依赖项以使用毕加索
add following dependency to use picasso
compile 'com.squareup.picasso:picasso:2.5.2'
这篇关于如何在onPostexecute AsyncTask中使用gridview的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!