Android - 无法向上滚动

时间:2014-10-01 22:04:56

标签: java android scroll adapter

首先,我在三周前首先关注Java,如果这段代码很糟糕,请耐心等待。这是学校的一项任务,我将在原型应用程序上构建并为其提供UI,因此适配器基本上就是我对此所做的一切。

我的问题是,只要我触摸滚动条,就会被抛到列表底部,无法向后滚动而不会被推回。

/**
 * VaxjoWeather.java
 * Created: May 9, 2010
 * Jonas Lundberg, LnU
 */

package dv106.weather;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

/**
 * This is a first prototype for a weather app. It is currently 
 * only downloading weather data for Växjo. 
 * 
 * This activity downloads weather data and constructs a WeatherReport,
 * a data structure containing weather data for a number of periods ahead.
 * 
 * The WeatherHandler is a SAX parser for the weather reports 
 * (forecast.xml) produced by www.yr.no. The handler constructs
 * a WeatherReport containing meta data for a given location
 * (e.g. city, country, last updated, next update) and a sequence 
 * of WeatherForecasts.
 * Each WeatherForecast represents a forecast (weather, rain, wind, etc)
 * for a given time period.
 * 
 * The next task is to construct a list based GUI where each row 
 * displays the weather data for a single period.
 * 
 *  
 * @author jlnmsi
 *
 */

public class VaxjoWeather extends ListActivity {
    //private InputStream input;
    private WeatherReport report = null;

    //private ArrayList<WeatherForecast> forecastList = new ArrayList<WeatherForecast>();

    private WeatherAdapter adapter;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        adapter = new WeatherAdapter(this);
        setListAdapter(adapter);

        //getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_DISABLED);

        try {
            URL url = new URL("http://www.yr.no/sted/Sverige/Kronoberg/V%E4xj%F6/forecast.xml");
            AsyncTask task = new WeatherRetriever().execute(url);
        } catch (IOException ioe ) {
            ioe.printStackTrace();
        }

        //adapter.notifyDataSetChanged();
    }

    private void PrintReportToConsole() {
        if (this.report != null) {
            /* Print location meta data */ 
            //System.out.println(report);

            /* Print forecasts */
            int count = 0;
            for (WeatherForecast forecast : report) {
                count++;                
                adapter.add(forecast);
            }
        }
        else {
            System.out.println("Weather report has not been loaded.");
        }
        //adapter.notifyDataSetChanged();
    }

    private class WeatherRetriever extends AsyncTask<URL, Void, WeatherReport> {
        protected WeatherReport doInBackground(URL... urls) {
            try {
                return WeatherHandler.getWeatherReport(urls[0]);
            } catch (Exception e) {
                throw new RuntimeException(e);
            } 
        }

        protected void onProgressUpdate(Void... progress) {

        }

        protected void onPostExecute(WeatherReport result) {
            report = result;
            PrintReportToConsole();
        }
    }

    // custom ArrayAdpater to show, weather icon, temperature, and precipation.
    class WeatherAdapter extends ArrayAdapter<WeatherForecast> {

        public WeatherAdapter(Context context) {
            super(context,R.layout.forecast);
        }

        @Override   // Called when updating the ListView
        public View getView(int position, View convertView, ViewGroup parent) {
            View row;
            if (convertView == null) {  // Create new row view object           
                LayoutInflater inflater = getLayoutInflater();
                row = inflater.inflate(R.layout.forecast,parent,false);
            }
            else    // reuse old row view to save time/battery
                row = convertView;

            // TextView for Temperature
            TextView temperature = (TextView)row.findViewById(R.id.temperature);
            temperature.setText(Integer.toString(this.getItem(position).getTemp())+" °C");

            // TextView for out Precipation.
            TextView precipation = (TextView)row.findViewById(R.id.rain);
            precipation.setText(String.valueOf(this.getItem(position).getRain())+" mm");

            // Image Icon for forecast.
            ImageView icon = (ImageView)row.findViewById(R.id.icon);
            String iconPath = "ic_";            

            if (this.getItem(position).getWeatherCode() <= 9){
                iconPath = iconPath+"0"+(Integer.toString(this.getItem(position).getWeatherCode()));
            }
            else {
                iconPath = iconPath+(Integer.toString(this.getItem(position).getWeatherCode()));
            }

            int resId = getResources().getIdentifier(iconPath, "drawable", getPackageName());

            // If the resource ID is invalid, as in the image not existing, we'll add the postfix for periods.
            if (resId == 0){

                // Set the icon image source dependent on period code given.
                if(this.getItem(position).getPeriodCode() == 3){
                    iconPath = iconPath +"n";
                }

                else if (this.getItem(position).getPeriodCode() == 2){

                    iconPath = iconPath +"d";
                }
                else {
                    iconPath = iconPath +"m";
                }

                resId = getResources().getIdentifier(iconPath, "drawable", getPackageName());
                icon.setImageResource(resId);
            }
            // Or if everything checked out, we'll just run with the resource ID and find our Icon.
            else {
                icon.setImageResource(resId);
            }

            return row;
        }
    }

}

我尝试应用另一个标准的arrayadapter并且实际上得到了相同的不需要的滚动结果,所以我不知道我遇到了什么问题。

2 个答案:

答案 0 :(得分:0)

做到这一点的方法是: 1:将ListView放在main.xml中 2:在ListView的Activity Make对象中,如此 - &gt; private ListView listView;在onCreate中将它连接到main.xml,如下所示:listView =(ListView)R.id.listView1; //无论它叫什么

3:接下来创建一个ArrayList: - &gt; private ArrayList arrayWeather = new ArrayList();

4:用天气数据填充arraylist,然后最终创建你创建的类的对象,并使用你的arraylist来显示数据。

实施例:     公共类ListUser扩展了BaseAdapter {

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return arraylistData.size(); // the arraylist u created
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return arraylistData.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return arraylistData.size();
    }

    @Override
    public View getView(final int position, View v, ViewGroup parent) {
        if(v == null){
            LayoutInflater lf = (LayoutInflater) BuyPets.this.getSystemService( Context.LAYOUT_INFLATER_SERVICE);
            v = lf.inflate(R.layout.forecast, null);
        }


        // setup here, done


        return v;
    }

}

答案 1 :(得分:0)

找到解决方案,显然它与我的代码无关。类建议我们使用Intel x86而不是ARM作为我们的仿真器。使用ARM滚动运行它就像预期的那样。