2016-11-21 9 views
0

Я хочу добавить шаблон MVP в свой проект. Я сделал BasePresenter, PresenterFactory, презентатором для представления (ContactPresenter), но данные в представлении не отображаются. Что я делаю неправильно? или что может быть проблемой?MVP - данные в представлении не отображаются

Вот 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); 
     } 
    } 

Интерфейс ContactView:

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

Класс App:

public class App extends Application { 

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

фрагмент, в котором я хочу, чтобы отобразить данные от ведущего:

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

     } 
    } 

ответ

1

сделать ниже в методе 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(); 

    } 
+0

Я пробовал, но это Безразлично Помогите. Я просто добавил логин в метод showData(), и код там вообще не выполняется. –

+0

ohh thats weird. Plz попытается исправить этот первый – kevz

+0

@ Lucky_girl: U не сделал вызов showData() mth. – kevz