Java 具有MVP的回收器视图
我的申请有问题。。。我不知道为什么我的Java 具有MVP的回收器视图,java,android,mvp,Java,Android,Mvp,我的申请有问题。。。我不知道为什么我的RecyclerView适配器没有得到通知,我知道我的列表正在更新,我的问题是我的RecyclerView没有更新,有人能帮我吗 MainPresenter.java: public class MainPresenter implements MainContract.MainPresenter { private MainContract.MainView mView; private Context context; private boolean
RecyclerView适配器
没有得到通知,我知道我的列表正在更新,我的问题是我的RecyclerView
没有更新,有人能帮我吗
MainPresenter.java:
public class MainPresenter implements MainContract.MainPresenter {
private MainContract.MainView mView;
private Context context;
private boolean firstTime = true;
private static List<PlayerModel> playerRecyclerList = new ArrayList<>();
private RetrofitAdapter retrofitAdapter;
private DaoSession daoSession;
private boolean loadMore = true;
MainPresenter(MainActivity mainActivity,DaoSession daoSession){
this.daoSession = daoSession;
this.mView = mainActivity;
this.context = mainActivity;
}
@Override
public void fabClicked() {
Intent intent = new Intent(context, EditActivity.class);
intent.putExtra("create",true);
context.startActivity(intent);
}
@Override
public void itemClicked(int pos) {
PlayerModel playerModel = retrofitAdapter.getPlayerRecyclerList().get(pos);
Intent intent = new Intent(context,DetailActivity.class);
intent.putExtra(Repository.NAME,playerModel.getName());
intent.putExtra(Repository.CITY,playerModel.getCity());
intent.putExtra(Repository.COUNTRY,playerModel.getCountry());
intent.putExtra(Repository.IMAGE_URL,playerModel.getImgUrl());
context.startActivity(intent);
}
@Override
public void loadData() {
if(!firstTime) {
playerRecyclerList.clear();
retrofitAdapter.notifyDataSetChanged();
}
loadDatabase();
firstTime = false;
}
private void loadDatabase() {
PlayerDao playerDao = daoSession.getPlayerDao();
List players = playerDao.queryBuilder().list();
Object[] playerArray = players.toArray();
for(Object player : playerArray){
ModelRecyclerHandler((Player) player);
}
retrofitAdapter = new RetrofitAdapter(context,this);
retrofitAdapter.setList(playerRecyclerList,false);
mView.loadRecycler(retrofitAdapter);
}
private void ModelRecyclerHandler(Player player) {
PlayerModel playerModel = new PlayerModel();
String name = player.getName();
String city = player.getCity();
String country = player.getCountry();
String imgUrl = player.getImgUrl();
Long ID = player.getId();
playerModel.setName(name);
playerModel.setCity(city);
playerModel.setCountry(country);
playerModel.setImgUrl(imgUrl);
playerModel.setID(ID);
playerRecyclerList.add(playerModel);
}
public void update(){
playerRecyclerList.clear();
PlayerDao playerDao = daoSession.getPlayerDao();
playerDao.deleteAll();
fetchPlayerList();
}
private void fetchPlayerList() {
RecyclerInterface api = RetrofitApi.getInstance().create(RecyclerInterface.class);
Call<String> call = api.getString();
call.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
assert response.body() != null;
if (response.isSuccessful()) {
mView.onSuccessGetApi();
String jsonresponse = response.body();
writeDatabase(jsonresponse);
}
}
@Override
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
}
});
}
private void writeDatabase(String response) {
String name,country,city,imgUrl;
try {
JSONObject obj = new JSONObject(response);
if(obj.optString("status").equals("true")){
JSONArray dataArray = obj.optJSONArray("data");
assert dataArray != null;
for(int i = 0; i<dataArray.length(); i++)
{
JSONObject dataobj = dataArray.getJSONObject(i);
PlayerModel playerModel = new PlayerModel();
name = dataobj.getString("name");
city = dataobj.getString("city");
country = dataobj.getString("country");
imgUrl = dataobj.getString("imgURL");
insertPlayer(name,country,city,imgUrl, (long) i);
playerModel.setName(name);
playerModel.setCity(city);
playerModel.setCountry(country);
playerModel.setImgUrl(imgUrl);
playerModel.setID((long) i);
playerRecyclerList.add(playerModel);
}
retrofitAdapter = new RetrofitAdapter(context,this);
retrofitAdapter.setList(playerRecyclerList,false);
mView.loadRecycler(retrofitAdapter);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void insertPlayer(String name,String city,String country,String imgUrl,Long ID)
{
PlayerDao playerDao = daoSession.getPlayerDao();
Player player = new Player();
player.setName(name);
player.setCity(city);
player.setCountry(country);
player.setImgUrl(imgUrl);
player.setId(ID);
playerDao.insert(player);
player = null;
}
public void editPlayer(int pos){
PlayerModel playerModel = getPlayerRecyclerList().get(pos);
Intent intent = new Intent(context,EditActivity.class);
intent.putExtra(Repository.NAME,playerModel.getName());
intent.putExtra(Repository.CITY,playerModel.getCity());
intent.putExtra(Repository.COUNTRY,playerModel.getCountry());
intent.putExtra(Repository.IMAGE_URL,playerModel.getImgUrl());
intent.putExtra("ID",playerModel.getID());
context.startActivity(intent);
}
public void deleteFromDB(int pos){
PlayerModel playerModel;
playerModel = playerRecyclerList.get(pos);
PlayerDao playerDao = daoSession.getPlayerDao();
playerDao.deleteByKey(playerModel.getID());
playerRecyclerList.clear();
retrofitAdapter.notifyItemChanged(pos);
loadDatabase();
}
@Override
public void onLongClick(int pos) {
mView.longClick(pos);
}
@Override
public void onBind(RetrofitAdapter.MyViewHolder holder, int position) {
PlayerModel playerModel = playerRecyclerList.get(position);
Glide.with(context).load(playerModel.getImgUrl()).into(holder.iv);
holder.name.setText(playerModel.getName());
holder.country.setText(playerModel.getCountry());
holder.city.setText(playerModel.getCity());
}
public void scroll(RecyclerView recyclerView){
if(!recyclerView.canScrollVertically(RecyclerView.FOCUS_DOWN)) {
if (loadMore) {
loadMoreDb();
}
}
}
private void loadMoreDb() {
playerRecyclerList.clear();
loadMore = false;
mView.showProgressBar();
android.os.Handler handler = new Handler();
handler.postDelayed(() -> mView.hideProgressBar(), 1000);
PlayerDao playerDao = daoSession.getPlayerDao();
List players = playerDao.queryBuilder().list();
Object[] playerArray = players.toArray();
for (Object player : playerArray) {
ModelRecyclerHandler((Player) player);
}
retrofitAdapter.setList(playerModelRecyclerList,true);
loadMore = true;
}
private List<PlayerModel> getPlayerRecyclerList() {return playerRecyclerList; }
@Override
public int getItemCount() {
return playerRecyclerList.size();
}
public RetrofitAdapter getRetrofitAdapter(){return retrofitAdapter;}
和我的主要活动
:
MainActivity.java
public class MainActivity extends AppCompatActivity implements MainContract.MainView{
MainContract.MainPresenter presenter;
@InjectView(R.id.recycler)
RecyclerView recyclerView;
@InjectView(R.id.rl)
SwipeRefreshLayout refreshLayout;
@InjectView(R.id.progressBar)
ProgressBar progressBar;
static RetrofitAdapter retrofitAdapter;
DaoSession daoSession;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
initView();
}
@Override
public void onResume(){
super.onResume();
presenter.loadData();
}
private void initView() {
daoSession = ((AppController) getApplication()).getDaoSession();
presenter = new MainPresenter(this,daoSession);
refreshLayout.setOnRefreshListener(this::refresh);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
presenter.scroll(recyclerView);
//retrofitAdapter = presenter.getRetrofitAdapter();
//retrofitAdapter.notifyDataSetChanged();
}
});
}
private void refresh() {
final Handler handler = new Handler();
handler.postDelayed(() -> {
presenter.update();
if(refreshLayout.isRefreshing()){
refreshLayout.setRefreshing(false);
}
},1000);
}
@Override
public void loadRecycler(RetrofitAdapter retrofitAdapter) {
MainActivity.retrofitAdapter = retrofitAdapter;
recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(),LinearLayoutManager.VERTICAL,false));
recyclerView.setAdapter(MainActivity.retrofitAdapter);
}
@Override
public void longClick(int position) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
String[] options = new String[2];
options[0] = "Edit ";
options[1] = "Delete ";
alertDialogBuilder.setItems(options, (dialog, which) -> {
if(which == 0){
presenter.editPlayer(position);
}else if(which == 1){
presenter.deleteFromDB(position);
}
});
alertDialogBuilder.create().show();
}
@Override
public void showProgressBar() {
progressBar.setVisibility(View.VISIBLE);
}
@Override
public void hideProgressBar() {
progressBar.setVisibility(View.INVISIBLE);
}
@Override
public void onSuccessGetApi() {
if(refreshLayout.isRefreshing()){
refreshLayout.setRefreshing(false);
}
}
@Override
public void addData(List<PlayerModel> players) {
retrofitAdapter.setList(players,true);
retrofitAdapter.notifyDataSetChanged();
recyclerView.setAdapter(retrofitAdapter);
}
@OnClick(R.id.fab)
public void fabClick(){
presenter.fabClicked();
}
@Override
protected void onDestroy(){
super.onDestroy();
ButterKnife.reset(this);
}
}
公共类MainActivity扩展AppCompatActivity实现MainContract.MainView{
main contract.main演示者演示者;
@InjectView(R.id.recycler)
回收视图回收视图;
@注入视图(R.id.rl)
SwipeRefreshLayout刷新布局;
@InjectView(R.id.progressBar)
ProgressBar ProgressBar;
静态改装适配器;
道会道会;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
注射(这个);
initView();
}
@凌驾
恢复时公开作废(){
super.onResume();
loadData();
}
私有void initView(){
daoSession=((AppController)getApplication()).getDaoSession();
presenter=新的主presenter(此会话);
setOnRefreshListener(this::refresh);
recyclerView.addOnScrollListener(新的recyclerView.OnScrollListener(){
@凌驾
已克隆的公共void(@NonNull RecyclerView RecyclerView,int-dx,int-dy){
演示者。滚动(recyclerView);
//RefughtAdapter=presenter.GetRefughtAdapter();
//infortutionAdapter.notifyDataSetChanged();
}
});
}
私有无效刷新(){
最终处理程序=新处理程序();
handler.postDelayed(()->{
update();
if(refreshLayout.isRefreshing()){
refreshLayout.setRefreshing(false);
}
},1000);
}
@凌驾
公共空隙装载机回收器(改装适配器){
MainActivity.RefughtAdapter=改型适配器;
setLayoutManager(新的LinearLayoutManager(getApplicationContext(),LinearLayoutManager.VERTICAL,false));
recyclerView.setAdapter(MainActivity.ConversionAdapter);
}
@凌驾
公共空长单击(内部位置){
AlertDialog.Builder alertDialogBuilder=新建AlertDialog.Builder(此);
字符串[]选项=新字符串[2];
选项[0]=“编辑”;
选项[1]=“删除”;
alertDialogBuilder.setItems(选项,(对话框,其中)->{
if(which==0){
演示者。编辑播放器(位置);
}else if(其中==1){
presenter.deleteFromDB(位置);
}
});
alertDialogBuilder.create().show();
}
@凌驾
公共空间显示进度条(){
progressBar.setVisibility(View.VISIBLE);
}
@凌驾
public void hideProgressBar(){
progressBar.setVisibility(View.INVISIBLE);
}
@凌驾
onSuccessGetApi()上的公共void{
if(refreshLayout.isRefreshing()){
refreshLayout.setRefreshing(false);
}
}
@凌驾
公共无效添加数据(列出玩家){
设置列表(players,true);
infortutionAdapter.notifyDataSetChanged();
recyclerView.setAdapter(改装适配器);
}
@OnClick(R.id.fab)
公共单击(){
presenter.fabClicked();
}
@凌驾
受保护的空onDestroy(){
super.ondestory();
巴特刀。重置(此);
}
}
我很感激你的任何想法谢谢。没有从首字母或分页显示?@RajasekaranM当我打开应用程序时,它工作正常,但如果向下滚动,它将不会更新回收器视图,因此它不会滚动更多,回收器视图显示旧内容请检查我的答案
public class MainActivity extends AppCompatActivity implements MainContract.MainView{
MainContract.MainPresenter presenter;
@InjectView(R.id.recycler)
RecyclerView recyclerView;
@InjectView(R.id.rl)
SwipeRefreshLayout refreshLayout;
@InjectView(R.id.progressBar)
ProgressBar progressBar;
static RetrofitAdapter retrofitAdapter;
DaoSession daoSession;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
initView();
}
@Override
public void onResume(){
super.onResume();
presenter.loadData();
}
private void initView() {
daoSession = ((AppController) getApplication()).getDaoSession();
presenter = new MainPresenter(this,daoSession);
refreshLayout.setOnRefreshListener(this::refresh);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
presenter.scroll(recyclerView);
//retrofitAdapter = presenter.getRetrofitAdapter();
//retrofitAdapter.notifyDataSetChanged();
}
});
}
private void refresh() {
final Handler handler = new Handler();
handler.postDelayed(() -> {
presenter.update();
if(refreshLayout.isRefreshing()){
refreshLayout.setRefreshing(false);
}
},1000);
}
@Override
public void loadRecycler(RetrofitAdapter retrofitAdapter) {
MainActivity.retrofitAdapter = retrofitAdapter;
recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(),LinearLayoutManager.VERTICAL,false));
recyclerView.setAdapter(MainActivity.retrofitAdapter);
}
@Override
public void longClick(int position) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
String[] options = new String[2];
options[0] = "Edit ";
options[1] = "Delete ";
alertDialogBuilder.setItems(options, (dialog, which) -> {
if(which == 0){
presenter.editPlayer(position);
}else if(which == 1){
presenter.deleteFromDB(position);
}
});
alertDialogBuilder.create().show();
}
@Override
public void showProgressBar() {
progressBar.setVisibility(View.VISIBLE);
}
@Override
public void hideProgressBar() {
progressBar.setVisibility(View.INVISIBLE);
}
@Override
public void onSuccessGetApi() {
if(refreshLayout.isRefreshing()){
refreshLayout.setRefreshing(false);
}
}
@Override
public void addData(List<PlayerModel> players) {
retrofitAdapter.setList(players,true);
retrofitAdapter.notifyDataSetChanged();
recyclerView.setAdapter(retrofitAdapter);
}
@OnClick(R.id.fab)
public void fabClick(){
presenter.fabClicked();
}
@Override
protected void onDestroy(){
super.onDestroy();
ButterKnife.reset(this);
}
}