如何在 Android MVP 项目中处理自定义 ArrayAdapter?

How to handle a custom ArrayAdapter in an Android MVP project?

我有一个 Android MVP 项目。我想将任何 Android 引用排除在演示者之外。这样,我可以将 UI 分隔在 Activity/View.

Activity 中有一个 ListView,它在适配器 (MyAdapter) 中使用自定义 ArrayList。这使用 MyModel 对象用数据填充 ListView

现在,我正在尝试初始化适配器和 ListView

通过在 activity 上这样做,我最终会得到类似

的结果
`MyAdapter adapter = new MyAdapter<MyModel>(this, R.layout.list_item, items);`

问题是 Activity 现在可以访问模型并引用了 ArrayList 项,我只想保留在演示者中并从那里管理它.

我无法在 Presenter 上移动设置适配器,因为我必须将上下文从 Activity 共享给 Presenter,设置适配器并将其传递回 Activity。问题在于演示者现在依赖于一个 Android 上下文对象(MVP Android 项目的演示者部分不应该有任何 Android 代码)。

所以问题是在这种情况下我该怎么办?我在哪里以及如何设置 ArrayAdapter?

  1. 我建议您使用 RecyclerView 而不是 ListView 以获得更好的性能。
  2. activity可以容纳RecyclerView,你应该让演示者从你的模型库中获取你想要的数据等。 在 Presenter 检索到数据后,您应该将新数据通知 Activity,并将其设置到 RecyclerAdapter。 现在,您的 activity 会膨胀所有关于视图的内容,并且演示者是数据和逻辑的中心。

您可以在 Presenter 中保留项目列表,然后在需要设置适配器时将其发送到 Activity。

我认为你可以做到:

合同:

public interface ViewContract {
    void setupContentList(ArrayList<MyModel> list);
}

public interface PresenterContract {
    void onViewCreated();
}

Activity:

public class MainActivity extends Activity implements ViewContract {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ......
        mListView = findViewById(R.id.listview);
        mPresenter.onViewCreated();
    }

    public void setupContentList(ArrayList<MyModel> list) {
        MyAdapter adapter = new MyAdapter<MyModel>(this, R.layout.list_item, items);
        mListView.setAdapter(adapter);
    }
}

主持人:

public class Presenter implements PresenterContract {

    public Presenter() {
        ArrayList<MyModel> mItems = new ArrayList();
        // Add items to the list
    }

    public void onViewCreated() {
        mView.setupContentList(mItems);
    }
}