0

以下のアダプターを使用して、メインのアクティビティからデータを入力しようとしています。アクティビティを実行すると、画面が空白のままになります。おそらくnullであるArrayListに関係していると思います。データが表示されない理由を教えてください。現在、このバグに 3 日間取り組んでいます :/

public class CopyOfSecondWheelAdapter extends AbstractWheelTextAdapter {

    ArrayList<convertor_pst> PostList = new ArrayList<convertor_pst>();
    public ImageLoader imageLoader; 

    Convertor main;

    public CopyOfSecondWheelAdapter(Context context) {
        super(context, R.layout.count_layout, NO_RESOURCE);
        setItemTextResource(R.id.country_name);
    }

    @Override
    public View getItem(int index, View cachedView, ViewGroup parent) {

        View view = super.getItem(index, cachedView, parent);
        ImageView img = (ImageView) view.findViewById(R.id.flag);

        imageLoader.DisplayImage(PostList.get(index).getDevise(), img);
        System.out.println("get item count:"+getItemsCount() );

        TextView text = (TextView)view.findViewById(R.id.lib);
        text.setText(PostList.get(index).getQuotite());

        return view;
    }

    @Override
    public int getItemsCount() {
        return  PostList.toArray().length;
    }


    @Override
    protected CharSequence getItemText(int index) {
        return PostList.get(index).getDevise().toString();
    }
}

アップデート:

私のメインクラスでは、すでに

ArrayList<convertor_pst> PostList = new ArrayList<convertor_pst>();

これは移入されています。

これが私のconvertor.classである私のメインクラスです

ArrayList<convertor_pst> PostList = new ArrayList<convertor_pst>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.convertor);
        context = this;

        text_devise_two = (TextView)findViewById(R.id.text_spacetwo);       

        final WheelView country = (WheelView) findViewById(R.id.country);
        country.setVisibleItems(10);
        country.setViewAdapter(new FirstWheelAdapter(this));


        edt_validate = (EditText)findViewById(R.id.edt_validate);

        current_type_loc = (TextView)findViewById(R.id.current_type_loc);
        refresh_header= (TextView)findViewById(R.id.refresh_header);

        //set current time
        Calendar c = Calendar.getInstance();
        SimpleDateFormat df = new SimpleDateFormat("dd/MMM/yyyy");
        String formattedDate = df.format(c.getTime());
        refresh_header.setText(getResources().getString(R.string.mise_a_jour)+" "+formattedDate);

        image_one = (ImageView)findViewById(R.id.image_one);
        image_two = (ImageView)findViewById(R.id.image_two);

        final WheelView currency = (WheelView) findViewById(R.id.currency);
        currency.setVisibleItems(10);
        currency.setViewAdapter(new CopyOfSecondWheelAdapter(this));

        country.addChangingListener(new OnWheelChangedListener() {
            @Override
            public void onChanged(WheelView wheel, int oldValue, int newValue) {

                if (!scrolling) {


                }
            }
        });

        country.addScrollingListener( new OnWheelScrollListener() {

            @Override
            public void onScrollingStarted(WheelView wheel) {

                scrolling = true;
            }

            @Override
            public void onScrollingFinished(WheelView wheel) {

                scrolling = false;
                //1.
                wheelSelector(country.getCurrentItem());

            }
        });


        currency.addScrollingListener( new OnWheelScrollListener() {

            @Override
            public void onScrollingStarted(WheelView wheel) {

                scrolling = true;
            }

            @Override
            public void onScrollingFinished(WheelView wheel) {

                scrolling = false;
                //1.
                secondWheel(currency.getCurrentItem());
            }
        });



        country.setCurrentItem(1);
        currency.setCurrentItem(3);
        new loadingTask().execute();
    }

    /*1. Change currency */
    public void wheelSelector (int id){

        if (id==0){

            current_type_loc.setText("EUR");
            image_one.setBackgroundResource(R.drawable.eur);

        }else {

            current_type_loc.setText("USD");
            image_one.setBackgroundResource(R.drawable.usd);

        }
    }

    class loadingTask extends AsyncTask<Void, Void,Void> {

          @Override
        protected void onPreExecute() {
        // TODO Auto-generated method stub
            pd = ProgressDialog.show(Convertor.this, "", "Chargement en cours..", true);

            super.onPreExecute();
        }

        @Override
        protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
            super.onPostExecute(result);

            pd.dismiss();
            doc = Jsoup.parse(getxml,"", Parser.xmlParser());

            taux = doc.select("taux");

            for (int i = 0; i < taux.size(); i++) {

                PostList.add(new convertor_pst(taux.get(i).getElementsByTag("devise").text().toString(),
                        taux.get(i).getElementsByTag("dateCours").text().toString(),
                        taux.get(i).getElementsByTag("libelle").text().toString(),
                        taux.get(i).getElementsByTag("quotite").text().toString(),
                        taux.get(i).getElementsByTag("fixing").text().toString()));
            }
        }

        @Override
        protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub

             envelope =
                    "soap content"

            String requestEnvelope=String.format(envelope, "28-03-2013","true");
            getxml = Util.CallWebService(URL,SOAP_ACTION,requestEnvelope);
            System.out.println(getxml);

            return null; 

        }
    }


    public void secondWheel(int index){

        text_devise_two.setText(PostList.get(index).getDevise());
        edt_validate.setText("   "+PostList.get(index).getFixing());

    }

    /*
     * 
     * (non-Javadoc)
     * @see android.app.Activity#onPause()
     * check if activity go to background
     */

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();

        if (Util.isApplicationBroughtToBackground(Convertor.this)==true){
            startActivity(new Intent(Convertor.this,Compte.class));
        }

    }


}

これはオリジナルのホイール アダプター クラスです。

public class CopyOfSecondWheelAdapter extends AbstractWheelTextAdapter {

    ArrayList<convertor_pst> PostList;
    public ImageLoader imageLoader; 

    // Countries names
    private String countries[] =
            new String[] {"EUR", "USD","EUR", "USD","EUR", "USD","EUR", "USD","EUR", "USD","EUR", "USD"};

    // Countries flags
    private int flags[] = new int[] {R.drawable.eur, R.drawable.usd,R.drawable.eur, R.drawable.usd,R.drawable.eur, R.drawable.usd,R.drawable.eur, R.drawable.usd,R.drawable.eur, R.drawable.usd,R.drawable.eur, R.drawable.usd};

    /**
     * Constructor
     */

    Convertor main;

    public CopyOfSecondWheelAdapter(Context context) {
        super(context, R.layout.count_layout, NO_RESOURCE);
        setItemTextResource(R.id.country_name);

    }

    @Override
    public View getItem(int index, View cachedView, ViewGroup parent) {

        View view = super.getItem(index, cachedView, parent);
        ImageView img = (ImageView) view.findViewById(R.id.flag);
        img.setImageResource(flags[index]);

        TextView text = (TextView)view.findViewById(R.id.lib);
        text.setText("code");

        return view;
    }

    @Override
    public int getItemsCount() {
        return  countries.length;
    }


    @Override
    protected CharSequence getItemText(int index) {
        return countries[index];
    }
}
4

2 に答える 2

0

私が理解する限りでは

currency.setViewAdapter(new CopyOfSecondWheelAdapter(this));

この行はアダプターを作成しますが、次の行でそれを埋めます:

new loadingTask().execute();

これは後なので、電話する必要があります

yourAdapter.notifyDataSetChanged();  

アダプタでデータを更新します。

Android デベロッパー ヘルプによると

notifyDataSetChanged() 接続されたオブザーバーに、基礎となるデータが変更されたこと、およびデータ セットを反映するすべてのビューがそれ自体を更新する必要があることを通知します。

だからあなたの場合、あなたはしなければなりません

  1. アダプターを作成します (yourAdapter = new CopyOfSecondWheelAdapter ....)
  2. setViewAdater (WheelView.setViewAdapter(yourAdapter)) で割り当てます
  3. 非同期タスクの「postExecute」で、yourAdapter.notifyDataSetChanged(); を呼び出します。

ところで、あなたが何をしているのかよくわかりませんが、データのセットを 2 つの異なる場所に表示する必要がある場合は、複製 (コピーを作成) する必要はありません。2 つのリスト表示は、同じアダプターを共有できます。

アップデート

あなたはあなたの質問を更新しました。私はその更新に答えます:

元のアダプターでは、国は非同期タスクに読み込まれません。したがって、アダプターを割り当てると、割り当てた時点でアダプターに値が存在するため、ディスプレイには正しい値が表示されます。

あなたの場合、非同期タスクに値をロードします。アダプターを作成したときは空であり、それを空に割り当てると、ディスプレイには空のリストが表示されます。データの変更をディスプレイに通知する必要があります。

ですので、原本では譲渡時の正しいデータですので届出の必要はありません。あなたの場合、notifyDataSetChanged() を実装する必要があります。または、拡張するアダプターのタイプを変更します。

于 2013-04-16T12:11:30.947 に答える