Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.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
Java 具有MVP的回收器视图_Java_Android_Mvp - Fatal编程技术网

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