java - MVP - View 中的数据不显示

标签 java android mvp

我想将 MVP 模式添加到我的项目中。我已经为 View (ContactPresenter)制作了BasePresenter、PresenterFactory、presenter,但是 View 中的数据不显示。我做错了什么?或者可能是什么问题?

这是 BasePresenter 类:

public abstract class  BasePresenter<V> {

    protected V view;
    private CompositeSubscription compositeSubscription=new CompositeSubscription();

    public void bindView(V view){
        this.view=view;
    }

    public void unBindView(){
        this.view=null;
        compositeSubscription.clear();
    }

    protected void addSubscription(Subscription subscription){
        compositeSubscription.add(subscription);
    }
} 

PresenterFactory 类:

public class PresenterFactory {

    private final BaseApi baseApi;
    private static PresenterFactory presenterFactory;
    private PresenterFactory(BaseApi baseApi) {
        this.baseApi = baseApi;
    }
    public static void create(BaseApi baseApi){
        if(presenterFactory ==null){
            presenterFactory =new PresenterFactory(baseApi);
        }
    }
    public static PresenterFactory getInstance() {
        return presenterFactory;
    }
    public BasePresenter get(String tag) {
        if (tag.equals(ContactPresenter.TAG)) {
            return new ContactPresenter(baseApi);
        }
        return null;
    }
}

ContactPresenter 类:

public class ContactPresenter extends BasePresenter<ContactView> {

        public static final String TAG = ContactPresenter.class.getName();

        BaseApi baseApi;
        private ArrayList<User> contacts;
        private ArrayList<Users> usersList;
        ContactAdapter contactAdapter;

        public ContactPresenter(BaseApi baseApi) {
            this.baseApi = baseApi;
            contacts=new ArrayList<>();
            usersList=new ArrayList<> ();
        }

        public void onCreate(){
            getUsers();

        }

        private void getUsers() {
            Subscription subscription = BaseApi.getInstance().service.users()
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(users -> {
                        usersList.add(users);
for (int i = 0; i < usersList.size(); i++) {
                        contacts.addAll(usersList.get(i).getUser());
                        );
                    }
view.showData(contacts);
                    }, throwable -> {
                        Log.e("User errors", String.valueOf(throwable));
                    });

            addSubscription(subscription);
        }
    }

接口(interface)ContactView:

public interface ContactView {
    void showData(ArrayList<User> contacts);
}

类应用程序:

public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        PresenterFactory.create(BaseApi.getInstance());
    }
}

我想在其中显示来自演示者的数据的 fragment :

public class ContactFragment extends Fragment implements ContactView {

    private ArrayList<User> contacts = new ArrayList<>();
    private ArrayList<Users> usersList = new ArrayList<>();

    private ContactAdapter contactAdapter;
    private RecyclerView rvView;
    private ContactPresenter mPresenter;
    private CompositeSubscription compositeSubscription = new CompositeSubscription();
    public ContactFragment() {

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);    
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_chat, container, false);
        rvView = (RecyclerView) view.findViewById(R.id.rvView);

        mPresenter = (ContactPresenter) PresenterFactory.getInstance().get(ContactPresenter.TAG);
        mPresenter.bindView(this);

        contactAdapter = new ContactAdapter(contacts, new OnItemClickListenerUser() {
            @Override
            public void onItemClick(User user) {

            }
        });



//          showData(contacts);
            RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
            rvView.setLayoutManager(mLayoutManager);
            rvView.setAdapter(contactAdapter);
            contactAdapter.notifyDataSetChanged();
            return view;
        }


        @Override
        public void onDestroy() {
            super.onDestroy();
            mPresenter.unBindView();
        }

        @Override
        public void showData(ArrayList<User> contacts) {
            this.contacts=contacts;
            contactAdapter.notifyDataSetChanged();

        }
    }

最佳答案

在方法 showData(ArrayList<User> contacts) 中进行如下操作

@Override
    public void showData(ArrayList<User> contacts) {
        this.contacts.addAll(contacts);
        //contactAdapter = new ContactAdapter(contacts, new OnItemClickListenerUser() {
        //    @Override
        //      public void onItemClick(User user) {

        //    }
        //});
        contactAdapter.notifyDataSetChanged();

    }

关于java - MVP - View 中的数据不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40713257/

相关文章:

java - "cannot find symbol variable VK_NEXT"

java - 我想更改名为 .hannesdorfmann :swipeback 的库中的一些内容

linq-to-entities - 错误 "Could not resolve mscorlib for target framework '

java - 创建 DatagramPackets 数组时,每个元素都与最近添加的元素相同

java - APT和AOP在同一个项目中,使用Maven

android - Android 中的样式和主题

android - Python 引发 SyntaxError

c# - WinForms 中使用 MVP 架构的 BackGroundWorker 最佳实践

Android MVP 对验证的怀疑

java - Java 中的正弦波声音发生器