Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用RxJava2从数据库获取最新数据并在顶部显示_Android_Mvvm_Retrofit2_Rx Java2 - Fatal编程技术网

Android 如何使用RxJava2从数据库获取最新数据并在顶部显示

Android 如何使用RxJava2从数据库获取最新数据并在顶部显示,android,mvvm,retrofit2,rx-java2,Android,Mvvm,Retrofit2,Rx Java2,我正在使用MVVM模式创建应用程序,并使用Reformation2和rxjava2从服务器获取数据并在“回收器”视图中显示。到目前为止,数据已在“回收器”视图中成功获取,但最近添加的数据显示在“回收器”视图的最后位置。我想在“回收器”视图的顶部显示最近添加的数据: 这是我在“回收器”视图中显示数据的代码: Contacts.java public class Contacts extends Fragment { private RecyclerView recyclerView; priva

我正在使用MVVM模式创建应用程序,并使用Reformation2和rxjava2从服务器获取数据并在“回收器”视图中显示。到目前为止,数据已在“回收器”视图中成功获取,但最近添加的数据显示在“回收器”视图的最后位置。我想在“回收器”视图的顶部显示最近添加的数据:

这是我在“回收器”视图中显示数据的代码:

Contacts.java

public class Contacts extends Fragment {

private RecyclerView recyclerView;
private List<Contact> contactList = new ArrayList<>();
private ContactsAdapter adapter;
private ProgressBar progressBar1;
private ContactViewModel viewModel;


public Contacts() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_contacts, container, false);

    recyclerView=  view.findViewById(R.id.recyclerView);
    progressBar1 = view.findViewById(R.id.progressBar1);

    viewModel = ViewModelProviders.of(this).get(ContactViewModel.class);

    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

    adapter = new ContactsAdapter(getActivity(),contactList);

    recyclerView.setAdapter(adapter);

    viewModel.getAllContacts().observe(this, new Observer<List<Contact>>() {
        @Override
        public void onChanged(List<Contact> contacts) {

            progressBar1.setVisibility(View.INVISIBLE);
            adapter.setContactList(contacts);
        }
    });

    return view;
  }

}
public class ContactViewModel extends AndroidViewModel {

ContactRepository repo;
MutableLiveData<List<Contact>> mutableLiveData;

public ContactViewModel(@NonNull Application application) {
    super(application);

    repo  = new ContactRepository(application);
    mutableLiveData = new MutableLiveData<>();
  }

public MutableLiveData<List<Contact>> getAllContacts() {
    return repo.getMutableLiveData();
  }
}
public class ContactRepository {

Context context;
MutableLiveData<List<Contact>> contactmutableLiveData = new MutableLiveData<>();

public ContactRepository(Context context){

    this.context = context;
}

public MutableLiveData<List<Contact>> getMutableLiveData() {

    Retrofit retrofit = RetrofitClient.getInstance();
    ApiService apiService = retrofit.create(ApiService.class);

    apiService.getContacts().subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<List<Contact>>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(List<Contact> contacts) {

                    contactmutableLiveData.setValue(contacts);

                }

                @Override
                public void onError(Throwable e) {

                    TastyToast.makeText(context,e.getMessage(),TastyToast.LENGTH_LONG,TastyToast.ERROR).show();
                }

                @Override
                public void onComplete() {

                }
            });

    return contactmutableLiveData;
  }

}
public class ContactsAdapter extends RecyclerView.Adapter<ContactsAdapter.ViewHolder> {

Context context;
List<Contact> contactList = new ArrayList<>();

public ContactsAdapter(Context context, List<Contact> contactList) {
    this.context = context;
    this.contactList = contactList;
}

@NonNull
@Override
public ContactsAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.contact_row,parent,false);

    ViewHolder viewHolder = new ViewHolder(v);

    return viewHolder;
}

@Override
public void onBindViewHolder(@NonNull ContactsAdapter.ViewHolder holder, int position) {

    final Contact contact = contactList.get(position);

    final String str1 = contact.getFirstname();
    final String str2 = contact.getLastname();

    holder.userName.setText(str1 + " " +str2);

}

@Override
public int getItemCount() {
    return contactList.size();
}

public void setContactList(List<Contact> contactList) {
    this.contactList = contactList;
    notifyDataSetChanged();
}

public class ViewHolder extends RecyclerView.ViewHolder{

    TextView userName;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        userName = itemView.findViewById(R.id.userName);
      }
   }

}
public class Contact {

String firstname,lastname;

public Contact(){

}

public Contact(String firstname,String lastname){

    this.firstname = firstname;
    this.lastname = lastname;

}

public String getFirstname() {
    return firstname;
}

public void setFirstname(String firstname) {
    this.firstname = firstname;
}

public String getLastname() {
    return lastname;
}

public void setLastname(String lastname) {
    this.lastname = lastname;
}
}
有人请让我知道如何才能得到想要的输出。任何帮助都将不胜感激


谢谢

您没有添加任何日期时间或标识符字段,您可以根据这些字段对数据进行排序。添加datetime并按降序对数据进行排序以获取最新数据。如果我从服务器获取日期时间,那么如何才能将最新数据排序在最上面。从服务器获取datetime是什么意思?你说的是进行api调用的时间吗?是的意思是如果我在服务器上节省时间和名称,然后在recycler视图中获取名称和时间,那么使用这种方法如何在顶部获取最新数据。你是否尝试过按时间戳对列表进行排序?