Java Android根据Observable<List<Object>>改变ListView对象

标签 java android listview retrofit rx-java2

我是 Java Android 新手。我正在对 restful 调用使用改造,几分钟前我发现了可观察对象的 reactivex。目标是在数据库中的值发生变化时“实时”更新 ListView 。更清楚一点: 我有一个带有 Restful 网络服务的后端。该应用程序通过改造调用此服务并将结果放入 ListView 中。 这是我的代码 fragment

其余客户端

public interface SalaClientObservable {

    @GET("kingestEE_war_exploded/rest/sala/{codAtt}")
    public Observable<List<Sala>> getSale(@Path("codAtt") String codAtt);

    @GET("kingestEE_war_exploded/rest/sala/aggiungiSala/{codAtt}/{nomeSala}")
    public Observable<String> aggiungiSala(@Path("codAtt") String codAtt,@Path("nomeSala") String nomeSala);

    @GET("kingestEE_war_exploded/rest/sala/rimuoviSala/{codAtt}/{nomeSala}")
    public Observable<String> rimuoviSala(@Path("codAtt") String codAtt,@Path("nomeSala") String nomeSala);

}

Activity

public class SceltaSala extends AppCompatActivity {

    ListView lista;
    TextView labelBenvenuto;

    private ListView mListView;

    private CompositeDisposable mCompositeDisposable;

    private AdattatoreSale mAdapter;

    private LinkedList<Sala> listaSale;

    Retrofit.Builder builder = new Retrofit.Builder().baseUrl("http://10.0.2.2:8080/");

    Retrofit retrofit;


    int chiamata = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scelta_sala);
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();
        builder = builder.addConverterFactory(GsonConverterFactory.create(gson));
        retrofit = builder.build();


         lista = (ListView) findViewById(R.id.ListaSale);
         labelBenvenuto = (TextView) findViewById(R.id.LabelBenvenuto);

         mCompositeDisposable = new CompositeDisposable();
         initListView();
         loadJSON();




    }

    private void initListView() {

        mListView = (ListView) findViewById(R.id.ListaSale);

    }

    private void loadJSON() {

        SalaClientObservable requestInterface = builder
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build().create(SalaClientObservable.class);

        mCompositeDisposable.add(requestInterface.getSale("Stefano")
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(this::handleResponse,this::handleError));


    }

    private void handleResponse(List<Sala> listSala) {

        listaSale = new LinkedList<>(listSala);
        Sala[] arr = new Sala[listaSale.size()];
        int i = 0;
        for(Sala s : listaSale){
            arr[i] = s;
            i++;
        }
        mAdapter = new AdattatoreSale(this,R.layout.rigasala,arr);
        mListView.setAdapter(mAdapter);


    }

    private void handleError(Throwable error) {

        System.out.println(error.getMessage());
    }

    @Override
    public void onDestroy() {
         super.onDestroy();
         mCompositeDisposable.clear();
    }

自定义适配器

public class AdattatoreSale extends ArrayAdapter<Sala> {

    List<Sala> nomiSale;

    int immagineInt = R.drawable.immagineprova;

    public AdattatoreSale(@NonNull Context context, @LayoutRes int resource, Sala[] objects) {
        super(context, resource, objects);
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.rigasala, null);

        ImageView immagine = (ImageView) convertView.findViewById(R.id.immagine);
        TextView testoRiga = (TextView) convertView.findViewById(R.id.nomeSala);

        Sala s = getItem(position);
        testoRiga.setText(s.getNomeSala());

        return convertView;
    }

ListView 仅在我旋转屏幕时更新。但我认为旋转调用(以某种方式) Activity 的“onCreate”方法,所以不是更新值的 compositeDisposable 而是简单地调用 GET 方法。 我在网上找到的这个 fragment 有什么问题? 或者更好的是,自动更新 ListView 的正确方法是什么?

最佳答案

如果您正尝试从数据库中获取“实时”数据,那么您的适配器数据就需要来自该数据库。通常你不需要为此使用 Rx,你可以使用 LoaderManager.LoaderCallbacks 来订阅数据库中的表(但设置起来有点麻烦) 然而,如果你想在你的应用程序中使用 Rx 和数据库,你应该使用新的 Android 架构组件,更具体地说 Room ,它在 DB 之上创建了一个很好的抽象层。设置完成后,您可以使用 Flowable 订阅数据库更改。 ,每次特定表发生变化时都会发出,并且您的所有服务层必须做的就是将从网络请求返回的数据保存到适当的表中。

希望这对您有所帮助!

关于Java Android根据Observable<List<Object>>改变ListView对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48102576/

相关文章:

java - log4j:错误无法解析文件

java - Android Canvas 没有在 Path 的指向外绘制 Path

java - 无法使用 sendKeys“WebElement 类型中的 sendKeys(CharSequence[]) 不适用于参数(字符串)”

java - 将时钟格式的字符串解析为int

java - 滚动时 ListView 中的项目顺序错误

java - 如何在数组列表中添加选定的值并从数组列表中删除未选定的值

java - 用java计算日出和日落

Android:如何找到 Id/修改/关闭来自 FCM 大推的通知

android - AppFlow 电容器构建错误 : PermissionDenied gradlew

php - 基于当前DP模型的Yii2 ListView自定义数据属性