APIからデータを収集して表示する必要があるアプリを作成しています。ビューを動的に作成し、それを linearlayout に追加します。これは、スレッドとハンドラーを使用すると正常に動作しますが、AsyncTask では奇妙な動作をします。
以下は私のOnPostExecuteです
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
productInfoFetched = productInfoFetched
+ productDetailTempList.size();
insertItems(productDetailTempList);
tvLoading.setVisibility(View.GONE);
if ((productInfoFetched != 0)
&& (productInfoFetched == totalProductCount)
&& (totalProductCount > 10))
btnSearch.setVisibility(View.VISIBLE);
else
btnSearch.setVisibility(View.GONE);
downloading = false;
Log.v("in download info task", "Last line of post exe");
}
insertItems(productDetailTempList); ビューを更新する必要がある Arraylist を取得します。実行されますが、この行が実行されるまで何も表示されません Log.v("in download info task", "Last line of post exe");
私のinsertItem関数は次のとおりです。
public void insertItems(
final ArrayList<ProductDetailsDTO> productDetailList2) {
// infoTaskObj = null;
infoTaskObj.cancel(true);
Log.v("AT status", infoTaskObj.getStatus().toString());
for (final ProductDetailsDTO product : productDetailList2) {
final Holder holder = new Holder();
View row = ((LayoutInflater) viewObject).inflate(
R.layout.product_id, null, false);
holder.product_image = (ImageView) row
.findViewById(R.id.product_image);
holder.product_name = (TextView) row.findViewById(R.id.name);
holder.sku = (TextView) row.findViewById(R.id.sku);
holder.price = (TextView) row.findViewById(R.id.price);
holder.ivOverlay = (ImageView) row.findViewById(R.id.ivOverLay);
holder.edbuton = (Button) row.findViewById(R.id.ibtnDel);
lstButton.add(holder.edbuton);
Log.v(TAG, "before immage set");
try {
URL url = new URL(product.url);
Bitmap bmp = BitmapFactory.decodeStream(url.openConnection()
.getInputStream());
Bitmap btmp = Bitmap.createScaledBitmap(bmp, 80, 80, true);
holder.product_image.setImageBitmap(btmp);
} catch (MalformedURLException e1) {
e1.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
holder.product_name.setText(product.name);
holder.sku.setText(product.sku);
holder.price.setText(product.price);
if (product.status.equalsIgnoreCase("0")) {
holder.ivOverlay.setVisibility(View.VISIBLE);
} else {
holder.ivOverlay.setVisibility(View.GONE);
}
if (ed_flag) {
holder.edbuton.setVisibility(View.VISIBLE);
row.setOnClickListener(null);
} else {
holder.edbuton.setVisibility(View.GONE);
row.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Log.v("Row clicked", "yes");
Object obj = view.getTag();
String tag = (String) obj;
try {
// Intent child = new Intent(productListActivity,
// ProductThumb.class);
if (holder.ivOverlay.getVisibility() == View.VISIBLE)
holder.ivOverlay.setVisibility(View.GONE);
else
holder.ivOverlay.setVisibility(View.VISIBLE);
Intent child = new Intent(productListActivity
.getParent(),
ProductCompleteDetailActivity.class);
child.putExtra("ProductDetailDTOList",
productDetailList);
child.putExtra("ProductDetailDTO", product);
productListActivity.startActivity(child);
// Intent intent = new
// Intent(productListActivity.getParent(),ProductCompleteDetailActivity.class);
// TabGroupActivity parentActivity =
// (TabGroupActivity)
// productListActivity.getParent();
// intent.putExtra("ProductDetailDTO", mData);
// parentActivity.startChildActivity("DisplayDetail",
// intent);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
// Toast.makeText(parent.getContext(),
// "Product id: " + mData.get(position).productId,
// Toast.LENGTH_SHORT).show();
}
});
}
holder.edbuton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
String status;
status = product.status;
Log.v("Id of product clicked in array list",
product.productId);
Log.v("Status of product", status);
if (status.equalsIgnoreCase("1")) {
disableProduct(product.productId, "0");
product.status = "0";
} else {
disableProduct(product.productId, "1");
product.status = "1";
}
}
});
llMainView.addView(row);
scroll = true;
}
}
llMainView.addView(row); のときに各項目が表示され始めるはずだと思います。この行が実行されます。しかし、そうではありません。OnPostExecute が完了するのを待ってから、すべてのアイテムが一緒に表示されます。ここで何か間違っていますか??