1

現在、リストビューを 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;
    }



}

立ち寄って助けてくれてありがとう...私の問題に対するコメントを待っています。

4

0 に答える 0