Fragment中表示列表的按钮功能

时间:2017-01-12 03:20:46

标签: android android-fragments

在我的应用中,我有Fragment代表项目列表。

这是使用RecyclerViewAdapter完成的。我已经实现了OnListFragmentInteractionListener,因此如果我点击列表中的某个项目,我的应用会执行某些操作。

这是正常的。但是,我决定在项目中添加一个按钮。因此,如果我点击按钮以外的任何地方但在该项目的边框内,它将像以前一样继续执行功能,但如果我点击按钮,它将执行其他操作。

我的问题是,我在哪里实现此功能?

表示列表中项目的XML文件只是几个文本视图和FloatingActionButton

我以为我必须在我的适配器中实现它,但到底在哪里?我的适配器看起来像这样:

public class ContractRecyclerViewAdapter extends RecyclerView.Adapter<ContractRecyclerViewAdapter.ViewHolder> {

    private final List<Contract> mValues;
    private final OnListFragmentInteractionListener mListener;

    public ContractRecyclerViewAdapter(List<Contract> items, OnListFragmentInteractionListener listener) {
        mValues = items;
        mListener = listener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.fragment_contract_item, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        holder.mItem = mValues.get(position);
        holder.mSell.setText(mValues.get(position).getSell());
        if (holder.mDescription != null) {
            holder.mDescription.setText(mValues.get(position).getDescription());
        }

        // TODO: Get the price from parameters?
        holder.mPrice.setText(((Double) new Random().nextDouble()).toString());

        holder.mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (null != mListener) {
                    // Notify the active callbacks interface (the activity, if the
                    // fragment is attached to one) that an item has been selected.
                    mListener.onListFragmentInteraction(holder.mItem);
                }
            }
        });

        holder.mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
    }

    @Override
    public int getItemCount() {
        return mValues.size();
    }

    public void addContract(Contract contract) {
        mValues.add(contract);
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public final View mView;
        public final TextView mSell;
        public final TextView mDescription;
        public final TextView mPrice;
        public final FloatingActionButton mBtn;
        public Contract mItem;

        public ViewHolder(View view) {
            super(view);
            mView = view;
            mSell = (TextView) view.findViewById(R.id.company_text);
            mDescription = (TextView) view.findViewById(R.id.contract_description);
            mPrice = (TextView) view.findViewById(R.id.price_text);
            mBtn = (FloatingActionButton) view.findViewById(R.id.buy_button_from_list);
        }

        @Override
        public String toString() {
            return super.toString() + " '" + mSell.getText() + ", " +
                    mDescription.getText() + "'";
        }
    }
}

问题在于,无论我为onClickListener实施FloatingActionButton,我都需要访问我的SharedPreferences,所以我想我必须在Activity中实现它class(或Fragment class)。真的吗?如果我这样走,那么我必须在Fragment中实现它,其内容是这个视图,但是我怎么知道所选项目的位置?

感谢。

2 个答案:

答案 0 :(得分:1)

您可以在interface

中创建另一种方法
private interface OnListFragmentInteractionListener {

    void onListFragmentInteraction(Contract mItem);

    void onButtonClicked(Contract mItem); // You may want to edit the arguments of the method

}

在您的活动中实施onButtonClicked并在那里完成您的工作。

按如下方式调用onClick Button内的方法,

holder.mBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (null != mListener) {
            mListener.onButtonClicked(holder.mItem);
        }
    }
});

答案 1 :(得分:0)

  

我如何知道所选项目的位置?

要获取所选项目的位置,您可以使用getAdapterPosition()RecyclerView.ViewHolder类的View.OnClickListener方法。

holder.btnXyz.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int position = holder.getAdapterPosition();
            Model item = items.get(position);
            /** your code **/
        }
    });