【发布时间】:2014-12-27 20:22:40
【问题描述】:
根据Creating Lists and Cards 和 RecyclerView 模式,我实现了一个显示一系列项目的卡片的活动。我希望每张卡片都有一个按钮,可以弹出该项目的选项对话框:
如您所见,每张卡片的右上角都有一个按钮。我已经这样实现了:
CardViewHolder.java:
public class CardViewHolder extends RecyclerView.ViewHolder {
protected TextView itemTitle;
protected TextView itemCode;
protected TextView itemDate;
protected TextView itemStatus;
protected Button optionsButton;
public CardViewHolder(View v) {
super(v);
itemTitle = (TextView) v.findViewById(R.id.itemTitle);
itemCode = (TextView) v.findViewById(R.id.itemCode);
itemStatus = (TextView) v.findViewById(R.id.itemStatus);
itemDate = (TextView) v.findViewById(R.id.itemDate);
optionsButton = (Button) v.findViewById(R.id.options_button);
}
}
然后,实现了在我的 RecyclerView 活动中设置的 DataAdapter:
DataAdapter.java:
public class DataAdapter extends RecyclerView.Adapter<CardViewHolder>{
private JSONArray mDataSet;
private Context mContext;
//constructor
public DataAdapter(JSONArray myDataSet, Context c) {
mContext = c;
mDataSet = myDataSet;
}
//creates new views (invoked by the layout manager)
@Override
public CardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//create a new view
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_text_view, parent, false);
//set the view's size, margins, padding and layout parameters
CardViewHolder vh = new CardViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(CardViewHolder holder, int position) {
//get element from dataset at position
//replace the contets of the view with that element
String title,itemCode,itemStatus, itemDate;
title = itemCode = itemDate = itemStatus = "";
try {
JSONObject item = new JSONObject(mDataSet.get(position).toString());
title = item.getString("desc");
itemCode = item.getString("code");
itemDate = item.getString("date");
itemStatus = item.getString("status");
} catch (JSONException e) {
e.printStackTrace();
}
holder.itemTitle.setText(title);
holder.itemCode.setText(itemCode);
holder.itemDate.setText(itemDate);
holder.itemStatus.setText(Html.fromHtml(itemStatus));
holder.optionsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(mContext,title,Toast.LENGTH_LONG).show();
}
});
}
@Override
public int getItemCount() {
return mDataSet.length();
}
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class ViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public TextView mTextView;
public ViewHolder(TextView v) {
super(v);
mTextView = v;
}
}
}
我对此的问题和想法是:
我如何通过这个按钮 onClick 监听这个项目的值?例如,尝试从 onClick 处理程序中访问
title是错误的,因为它不是最终变量,而是从内部类中访问的。另一方面,如果我让我的 DataAdapter 类实现 View.onClickListener 接口,我仍然不确定如何从 onClick 方法中获取这些项目特定的值。这是否被认为是一种好的做法? (将应用程序上下文传递给我的 DataAdapter)?我应该从另一个角度攻击这个吗?
【问题讨论】:
标签: android android-recyclerview