現在、リストビューを asynctask 内で更新できるようにしようとしています。データの取得は問題ではありません。問題はメイン スレッドの UI の更新にあります。知りたい場合に備えて、データを取得するために webservice メソッドを使用しています。
adapter.notifyDataSetChanged(); を試しました。, listView.refreshDrawableState(); & listView.requestLayout(); 個別に、または一緒に、どれも機能しませんでした。
また、私のasynctaskのdoingInbackgroundとonPostExecuteの両方でrunOnUiThread関数を試しましたが、どちらも機能しません。
私はフォーラムを通過し、ほとんどすべてのことを試しましたが、他の人が解決策を進めている間、どういうわけか私はまだ問題を抱えています.
最初に、xml データストアから取得したデータの最初のアイテムが表示されますが、他のすべてのアイテムは表示されません。しかし、向きを横向きに変更すると、最後の 2 行がビューにすぐに表示されません。リストの最後の項目まで下にスクロールすると、値が表示され、上の 2 行は表示されません。上にスクロールすると、リストの 2 行目が表示されます。
アプリの最初の外観は次のとおりです。
http://img525.imageshack.us/img525/1035/androidimage.png
これは、NewListView と呼ばれる私のメイン スレッドの一部です。
package com.nico.gg;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.res.Configuration;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast;
public class NewListView extends Activity {
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
ListView listView;
List<RowItem> rowItems;
ProgressDialog PostingDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
PostingDialog = new ProgressDialog(this);
PostingDialog.setTitle("Updating Rates");
PostingDialog.setMessage("Retrieving Rates, Please wait...");
PostingDialog.setIndeterminate(true);
PostingDialog.setCancelable(true);
rowItems = new ArrayList<RowItem>();
listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(new CustomListViewAdapter(this, R.layout.list_row,
rowItems));
new DownloadXmlTask().execute();
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
Toast.makeText(getApplicationContext(), "Clicked!", Toast.LENGTH_SHORT).show();
}
});
}
public class DownloadXmlTask extends
AsyncTask<Void, Integer, ArrayList<Rate>> {
@Override
protected ArrayList<Rate> doInBackground(Void... value) {
ArrayList<Rate> val = loadXmlFromNetwork();
return val;
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
PostingDialog.show();
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}
protected void onPostExecute(ArrayList<Rate> val) {
super.onPostExecute(val);
PostingDialog.dismiss();
CustomListViewAdapter adapter = (CustomListViewAdapter)listView.getAdapter();
try {
if (val.size() > 1) {
// for(Rate y: x){
for (int i = 0; i < val.size(); i++) {
RowItem item = new RowItem(R.drawable.rihanna,
String.valueOf(val.get(i).getGasRate()), val
.get(i).getDateModified()
.toLocaleString());
adapter.add(item);
}
adapter.setNotifyOnChange(true);
listView.setAdapter(adapter);
Toast.makeText(NewListView.this, "Rates Updated",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(),
"Rates Updated Failed", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), e.toString(),
Toast.LENGTH_LONG).show();
}
}
}
private ArrayList<Rate> loadXmlFromNetwork() {
return new CallSoap().MostRecentPetrojamRate();
}
}
これは私のカスタム アダプター クラスです
package com.nico.gg;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class CustomListViewAdapter extends ArrayAdapter<RowItem> {
Context context;
public CustomListViewAdapter(Context context, int resource,
List<RowItem> items) {
super(context, resource, items);
this.context = context;
// TODO Auto-generated constructor stub
}
private class ViewHolder{
ImageView image;
TextView txtRateName;
TextView txtDatePosted;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder = null;
RowItem rowItem = getItem(position);
View row = convertView;
LayoutInflater mInflater = (LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if(row == null){
row = mInflater.inflate(R.layout.list_row,null);
holder = new ViewHolder();
holder.txtRateName = (TextView)row.findViewById(R.id.gastype);
holder.txtDatePosted = (TextView)row.findViewById(R.id.date);
holder.image = (ImageView)row.findViewById(R.id.list_image);
row.setTag(holder);
}else{
holder = (ViewHolder)row.getTag();
holder.txtRateName.setText(rowItem.getRateName());
holder.txtDatePosted.setText(rowItem.getDatePosted());
holder.image.setImageResource(rowItem.getRateImgId());
}
return row;
}
}
立ち寄って助けてくれてありがとう...私の問題に対するコメントを待っています。