适配器不显示内容

时间:2013-04-16 10:20:06

标签: java android listview

我正在尝试使用下面的适配器填充主要活动中的数据。当我运行活动时,屏幕仍然是空白的。我相信它与ArrayList有关,也许是null。有人可以告诉我为什么我的数据没有显示。我已经在这个bug上待了三天了:/

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];
    }
}

2 个答案:

答案 0 :(得分:0)

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

为适配器中的列表创建一个setter,并在onPostExecute()

中设置列表

答案 1 :(得分: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();
  4. 进行调用

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

    <强>更新

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

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

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

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