6

我正在尝试将片段和列表视图与数组适配器一起使用,并且无法从数组适配器中的 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;
    }
4

2 回答 2

2

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

由于您具有如此强的耦合,因此要么将RecipientsFragment其作为参数添加到构造函数中,要么按照 Joe 的建议并onListItemClick在 Fragment 本身的 ListView 上使用。然而,在适配器中使用OnClickListeners 通常是合法的(例如,多个可点击的项目),因此在这些情况下,您必须只传递 Fragment 本身。

如果您发现超过 2 个不同的事物将使用该适配器(例如,3 个不同的 Fragment),请引入一个回调接口并让 Fragments 实现它(并将该接口作为参数传递给构造函数)。

于 2013-07-25T18:16:17.250 回答
2

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

于 2013-07-25T18:09:04.147 回答