【问题标题】:Android, Best way to populate Endless List View's data with Retrofit?Android,使用 Retrofit 填充 Endless List View 数据的最佳方法?
【发布时间】:2015-06-14 05:32:06
【问题描述】:

我已经成功地将数据填充到列表视图中,但我的方式似乎很糟糕,因为当我滚动列表视图时,改造总是得到所有存储库。那么,用改造填充 Endless List 视图数据的最佳方法是什么?谢谢...

MainActivity.java

    public class MainActivity extends Activity {

        public static final String ENDPOINT = "http://rfhan.com";
        private List<Tempat> tempatList;
        private TempatAdapter tadapter;
        private EndlessListView lv;
        private int start=0;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tempatList = new ArrayList<Tempat>();
            tadapter = new TempatAdapter(this, R.layout.item_tempat, tempatList);
            lv = (EndlessListView) findViewById(R.id.el);
            lv.setLoadingView(R.layout.loading_layout);
            lv.setAdapter(tadapter);

            //init data to my list
            requestData();

            //scroll listener
            lv.setListener(new EndlessListener() {

                @Override
                public void loadData() {
                    requestData();
                }
            });
        }

        private void requestData(){

            RestAdapter adapter = new RestAdapter.Builder()
                .setEndpoint(ENDPOINT)
                .build();

            TempatAPI api = adapter.create(TempatAPI.class);
            api.getAllData(new Callback<List<Tempat>>() {


                //here the problem 
                @Override
                public void success(List<Tempat> data, Response arg1) {
                    updateData(data);
                }

                @Override
                public void failure(RetrofitError arg0) {

                    Toast.makeText(MainActivity.this, "Retrofit Error!", Toast.LENGTH_LONG).show();
                    Toast.makeText(MainActivity.this, arg0+"", Toast.LENGTH_LONG).show();   
                }
            });
        }

        //the tmpt list is contain all Tempat's data
        //code below is to get some tmpt's data into new Arraylist
        //and update the adapter's data
        //it's work but seems bad way

        private void updateData(List<Tempat> tmpt){
            tempatList = new ArrayList<Tempat>(); 
            start+=10;
            for(int i=start-10;(i<start&&start<tmpt.size());i++)
            tempatList.add(tmpt.get(i));
            lv.addNewData(tempatList);
        }

        protected boolean isOnline() {
            ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            if (netInfo != null && netInfo.isConnectedOrConnecting()) {
                return true;
            } else {
                return false;
            }
        }
   }

模型Tempat.java

import java.math.BigInteger;
import android.graphics.Bitmap;

public class Tempat {

    BigInteger idkoleksi;
    String nama;
    String kategori;
    String alamat;
    String notelp;
    String jambuka;
    String jamtutup;
    String harga;
    String imageHeaderURL;
    double latitude;
    double longitude;
    int jumlahview;
    int jumlatrate;
    double rating;
    String tanggal;
    Bitmap bitmap;

    public BigInteger getIdkoleksi() {
        return idkoleksi;
    }
    public String getNama() {
        return nama;
    }
    public String getKategori() {
        return kategori;
    }
    public String getAlamat() {
        return alamat;
    }
    public String getNotelp() {
        return notelp;
    }
    public String getJambuka() {
        return jambuka;
    }
    public String getJamtutup() {
        return jamtutup;
    }
    public String getHarga() {
        return harga;
    }
    public String getImageHeaderURL() {
        return imageHeaderURL;
    }
    public double getLatitude() {
        return latitude;
    }
    public double getLongitude() {
        return longitude;
    }
    public int getJumlahview() {
        return jumlahview;
    }
    public int getJumlatrate() {
        return jumlatrate;
    }
    public double getRating() {
        return rating;
    }
    public String getTanggal() {
        return tanggal;
    }
    public void setIdkoleksi(BigInteger idkoleksi) {
        this.idkoleksi = idkoleksi;
    }
    public void setNama(String nama) {
        this.nama = nama;
    }
    public void setKategori(String kategori) {
        this.kategori = kategori;
    }
    public void setAlamat(String alamat) {
        this.alamat = alamat;
    }
    public void setNotelp(String notelp) {
        this.notelp = notelp;
    }
    public void setJambuka(String jambuka) {
        this.jambuka = jambuka;
    }
    public void setJamtutup(String jamtutup) {
        this.jamtutup = jamtutup;
    }
    public void setHarga(String harga) {
        this.harga = harga;
    }
    public void setImageHeaderURL(String imageHeaderURL) {
        this.imageHeaderURL = imageHeaderURL;
    }
    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }
    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }
    public void setJumlahview(int jumlahview) {
        this.jumlahview = jumlahview;
    }
    public void setJumlatrate(int jumlatrate) {
        this.jumlatrate = jumlatrate;
    }
    public void setRating(double rating) {
        this.rating = rating;
    }
    public void setTanggal(String tanggal) {
        this.tanggal = tanggal;
    }
    public Bitmap getBitmap() {
        return bitmap;
    }
    public void setBitmap(Bitmap bitmap) {
        this.bitmap = bitmap;
    }





}

存储库 TempatAPI.java

import java.util.List;

import retrofit.Callback;
import retrofit.http.GET;

public interface TempatAPI {
    @GET("api/tempat/get_all_data.php")
    public void getAllData(Callback<List<Tempat>> response);
}

Web 服务 API get_all_data.php

<?php

$response = array();
require_once __DIR__ . '/db_connect.php';

$db = new DB_CONNECT();
$nama=$_GET["nama"];

$query = "SELECT DataKoleksi.* , DataStatistikKoleksi.* FROM DataKoleksi, DataStatistikKoleksi WHERE DataKoleksi.idkoleksi = DataStatistikKoleksi.idkoleksi";
$result = mysql_query($query) or die(mysql_error());
$response = array();

if (mysql_num_rows($result) > 0) {



    while ($row = mysql_fetch_array($result)) {

        $koleksi = array();
        $koleksi["idkoleksi"] = $row["idkoleksi"];
        $koleksi["nama"] = $row["nama"];
        $koleksi["kategori"] = $row["kategori"];
        $koleksi["alamat"] = $row["alamat"];
        $koleksi["notelp"] = $row["notelp"];
        $koleksi["jambuka"] = $row["jambuka"];
        $koleksi["jamtutup"] = $row["jamtutup"];
        $koleksi["harga"] = $row["harga"];
        $koleksi["imageHeaderURL"] = $row["imageHeaderURL"];
        $koleksi["latitude"] = $row["latitude"];
        $koleksi["longitude"] = $row["longitude"];

        $koleksi["jumlahview"] = $row["jumlahview"];
        $koleksi["jumlahrate"] = $row["jumlahrate"];
        $koleksi["rating"] = $row["rating"];
        $koleksi["tanggal"] = $row["tanggal"];

        array_push($response, $koleksi);
    }
    echo json_encode($response);
} else {
    // no found
    echo json_encode($response);
}
?>

【问题讨论】:

    标签: java android web-services retrofit


    【解决方案1】:

    您需要在列表视图中添加一个侦听器,以查看您是否已滚动到列表末尾。在下面的示例中,我们检查是否已到达列表末尾,如果已到达,我们尝试再加载 10 个项目。然后更新列表视图。

    lvEvents.setOnScrollListener(new AbsListView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView absListView, int scrollState) {}
    
        @Override
        public void onScroll(AbsListView absListView, int firstVisible, int visibleCount, int totalCount) {
            boolean loadMore = firstVisible + visibleCount >= totalCount;
    
            if (loadMore && !isLoadingEvents && futureEvents.size() >= 10 && !noMoreEvents) {
                Log.d(TAG, "LOADING MORE EVENTS");
                isLoadingEvents = true;
                networkManager.getTenMoreEvents(getActivity(), new NetworkManager.Request() {
                    @Override
                    public void finished() {
                        updateEventsFeed();
                        isLoadingEvents = false;
                    }
                });
            }
        }
    
    });
    

    【讨论】:

    • 感谢您的回复。但这不是我的问题问题不在侦听器列表上,而是如何设置 Retrofit 以便能够调整要输入到列表视图中的数据。我的代码可以工作,但改造总是从 WEB API 中获取所有数据,所以我使用新的 ArrayList 进行操作(可以在方法“UpdateData ()”中看到)。当然,这种方式需要大量的数据网络。那么如何设置 Retrofit 不获取所有数据呢?希望你能理解我的问题
    • 您不能告诉 Retrofit 检索特定的数据部分。收到所有内容后,您必须对其进行过滤。
    • 您必须在您的 API 上实现某种标志,因此当您发出 API 请求时,它只会返回您想要的数据部分。
    猜你喜欢
    • 2021-06-16
    • 2020-01-08
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多