我的业务逻辑应该在上面的片段还是活动中?

时间:2013-01-20 18:01:22

标签: android

我正在尝试使用带有数组适配器的片段和列表视图,并且无法从数组适配器中的onClickListener调用我的方法。

如果我正确理解了模式,片段应该是自给自足的,所以我想把我的业务逻辑放在那里。但我无法从阵列适配器调用它。如果我将它放在主要活动中,我可以调用它,但是这不能阻止我在另一个活动中使用该片段并打破范式吗?

我的业务逻辑是在错误的地方,还是我没有正确地调用它?

这是我的ArrayAdapter;

public class RecipientsListAdapter extends ArrayAdapter<Recipient>{

    Context context;
    int layoutResourceId;   
    Recipient data[] = null;

    public RecipientsListAdapter(Context context, int layoutResourceId, Recipient[] data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View row = convertView;
        RecipientHolder holder = null;

        final boolean isLastRow = (position == data.length-1);

        if(row == null)
        {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new RecipientHolder();
            holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon);
            holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);

            row.setTag(holder);
        }
        else
        {
            holder = (RecipientHolder)row.getTag();
        }

        final Recipient recipient = data[position];
        holder.txtTitle.setText(recipient.displayName);
        holder.imgIcon.setImageResource(recipient.icon);

        row.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                ((MainActivity)context).onChildItemSelected(position);
                if(isLastRow){
                //((RecipientsFragment).getContext()).launchContactPicker();


                    ((MainActivity)context)).launchContactPicker();


                }
                else{
                    Toast.makeText(getContext(), recipient.displayName, Toast.LENGTH_SHORT).show();
                }
            }
        });

        return row;
    }

2 个答案:

答案 0 :(得分:2)

Adapter不应该是调用任何单击侦听器的内容,也不应该在getView()方法中附加单击侦听器。相反,您应该使用ListFragment,并简单地覆盖片段中的onListItemClick()。然后,您可以通过调用侦听器接口回调将该事件分派给Activity,或者直接在Fragment中处理它。如果您想在SDK 11发布之前支持Android版本,也可以使用support library

答案 1 :(得分:2)

不要向上传给你的上下文,这是隐式地将适配器耦合到特定的Activity而不在构造函数签名中宣布它。

由于你有这么强的耦合,要么将RecipientsFragment作为参数添加到构造函数中,要么执行Joe建议并在Fragment本身的ListView上使用onListItemClick。但是,在适配器中使用OnClickListener通常是合法的用途(例如,多个可点击的项目),因此在这些情况下,您只需要传递片段本身。

如果您发现有两个以上不同的东西将使用该适配器(例如,3个不同的片段),请引入一个回调接口并让Fragments实现它(并将该接口作为参数传递给构造函数)。