【发布时间】: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