【问题标题】:Java Android change ListView Object according to Observable<List<Object>>Java Android 根据 Observable<List<Object>> 改变 ListView 对象
【发布时间】:2018-06-14 14:45:45
【问题描述】:

我是 Java Android 新手。我正在使用改造来进行安静的调用,我在几分钟前发现了可观察对象的反应性。目标是在数据库上的值更改时更新列表视图“实时”。为了更清楚: 我有一个带有宁静网络服务的后端。该应用程序通过改造调用此服务并将结果放入列表视图中。 这是我的代码sn-ps

剩下的客户

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);

}

活动

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 仅在我旋转屏幕时更新。但我认为旋转调用(以某种方式)活动的“onCreate”方法,所以不是更新值的compositeDisposable,而是简单地调用GET方法。 我在网上找到的这个sn-p有什么问题? 或者更好的是,自动更新列表视图的正确方法是什么?

【问题讨论】:

  • 澄清一下 - 当您的服务器上的数据库发生变化时,您正试图让您的应用更新?
  • 是的,我需要它,而且问题并不特定于我正在使用的技术。我发现只有这种方法,但每种方法都有帮助
  • 然后你要么必须定期轮询你的服务器(你可以用 Rx 来做)或者使用某种 websockets 实现。无论哪种方式,它都超出了单个问题的范围。

标签: java android listview retrofit rx-java2


【解决方案1】:

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

希望这会有所帮助!

【讨论】:

  • 如果你觉得那个房间更舒服,我会试试的。真正的问题(由我自己创建!!)是作为列表视图数据源的对象列表是不可观察的(还有另一个列表属于可观察类别)所以,在这种情况下,我需要检测事件“ observable changed" 以触发列表的更改对象。我会尝试用你的方法重新开始
  • 好的,我看到了 Room,但我只找到了允许将应用程序连接到 sqlite DB 的源。那么问题来了:如何根据restful调用查询到的远程数据库更新sqlite?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多