0

我正在尝试使用下面的适配器从我的主要活动中填充数据。当我运行活动时,屏幕保持空白。我相信这与可能为 null 的 ArrayList 有关。谁能告诉我为什么我的数据没有显示。我在这个错误上已经三天了:/

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

如果我没看错的话,你有 2 倍的变量名PostList让你感到困惑。一个在您的活动中创建,一个在您的适配器中创建,并且您调用add()活动的变量,适配器中的列表永远不会获取项目。

为您的适配器中的列表创建一个设置器,并在您的onPostExecute().

于 2013-04-16T12:09:21.613 回答
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() 进行调用;

顺便说一句,我不确定你在做什么,但如果你需要在两个不同的位置显示一组数据,你不需要复制(创建一个副本)。两个列表显示可以共享同一个适配器。

更新

您已对您的问题进行了更新,我对此更新进行了回答:

在原始适配器中,国家/地区未加载到异步任务中。因此,当您分配适配器时,显示屏会显示正确的值,因为它们在您分配适配器时就存在于适配器中。

在您的情况下,您在异步任务中加载值。当您创建适配器时,它是空的,并且您将其分配为空,因此显示屏会显示一个空列表。您应该将数据更改通知您的显示器。

因此,在原件中,无需通知,因为数据在分配时是正确的。在您的情况下,您必须实现 notifyDataSetChanged()。或者更改您要扩展的适配器类型。

于 2013-04-16T12:11:30.947 回答