在我的应用中,我有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
中实现它,其内容是这个视图,但是我怎么知道所选项目的位置?
感谢。
答案 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 **/
}
});