【问题标题】:Should a listview Adaptor also be responsible for the listview "behaviour"? [closed]列表视图适配器是否也应该对列表视图“行为”负责? [关闭]
【发布时间】:2016-04-11 10:49:25
【问题描述】:

我正在编写一个应用程序,其中有一个列表视图,其中包含一个文本视图和几个按钮。

在列表视图适配器中,当我为一个列表视图项创建视图时,我还将事件处理程序附加到按钮,其行为严格取决于该列表视图项的 textview 值。

现在我的问题是,虽然在适配器中创建视图时将事件处理程序附加到按钮似乎是最好的做法,但在适配器中拥有事件处理程序本身也是一个好主意吗?我知道它会起作用,但我更关心代码的分离管辖权。我发现适配器还包含触发按钮时的代码有点奇怪。您是否认为事件处理程序可以在包含列表视图的活动中找到更好的归宿,而不是在适配器中?你有什么意见?

【问题讨论】:

    标签: android listview design-patterns


    【解决方案1】:

    在我看来 - 是的,你是对的,事件处理程序应该在 Activity/Fragment 中,包含 ListView,而不是在 Adapter

    也许我在这种情况下的方法并不理想,但这里是:
    例如,我在 Adapter 中(或在其外部)创建了一个接口

        public interface MyAdapterCallback {
            void buttonClicked(int buttonId, int position, int param2);
        }
    

    当然,您可以传递任意数量的参数。

    Adapter 构造函数中,我传递了对象的实例,实现了这个接口(@98​​7654327@ 本身)。
    然后我的Activity 实现了这个接口并覆盖了buttonClicked(),在那里我做了想要的操作。

    在 MyAdapter 中,我将 OnClickListeners 放在按钮上,
    onClick() 中,我只调用 _callback.buttonClicked(passing your params)


    希望这个答案有用:)

    更新。
    好的,我会在不使用界面的情况下提供答案。
    让您的 Activity 像这样实现 OnClickListener

    public class MainActivity implements View.OnClickListener{
    
        @Override
        public void onClick(View v) {
            //do your actions here
        }
    }
    

    那么,这里是你的Adapter的部分实现:

    public class MyAdapter extends ArrayAdapter<String> {
        private MainActivity _mainActivity;
    
        public MyAdapter(Context context, int resource, MainActivity mainActivity) {
            super(context, resource);
            _mainActivity = mainActivity;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Button button;
            button.setOnClickListener(_mainActivity);
            return super.getView(position, convertView, parent);
        }
    }
    

    在这种情况下,当您按下按钮时 - MainActivity 中的 onClick 将被调用。

    另一种选择。
    让你的Activity 像这样:

    public class MainActivity {
        public void onButtonInAdapterClick(your params) {
            //do your actions here
        }
    }
    

    还有一个Adapter:

    public class MyAdapter extends ArrayAdapter<String> {
        private MainActivity _mainActivity;
    
        public MyAdapter(Context context, int resource, MainActivity mainActivity) {
            super(context, resource);
            _mainActivity = mainActivity;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Button button;
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    _mainActivity.onButtonInAdapterClick(your params);
                }
            });
            return super.getView(position, convertView, parent);
        }
    }
    

    选择您需要的选项)

    【讨论】:

    • 对不起,我对 C# 有点陌生,所以有一部分我没有得到......你说你传递了接口的实例,但是接口不能有实例?
    • 我传递了一个对象,实现了这个接口(我编辑了一个答案)。是的,接口本身不能有实例。我的代码是用于 Java 的;)
    • 是的,我考虑过.. :) 老实说,如果我必须更好地理解 OOP 的一件事,那就是接口,这就是为什么我犹豫要否决您的答案。我不具备判断它的技能... :\ 也许如果您在不使用接口的情况下提出解决方案,我可能会支持您:) 非常感谢您在回答中提供的详细信息,也许在从现在开始的某个时间,我可以回到这一点并充分欣赏它。
    • 请检查我更新的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    相关资源
    最近更新 更多