RatingBar Listener 在滚动 Recycler View 时调用
RatingBar Listener is calling when scrolling Recycler View
我在 RecyclerView 上工作,我的视图上有 ratindBar。问题是当我向下滚动时,我的 RatingBar 侦听器一次又一次地调用。我在下面提供适配器 class 代码。我有一个方法在我滚动时调用多次,实际上它必须只在我触摸评级栏时调用。
提前致谢。
public class Order_Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Filterable {
public void setiCartListener(ICart iCartListener) {
this.iCartListener = iCartListener;
}
private OnItemClickListener onItemClickListener;
@Override
public int getItemViewType(int position) {
if (isPositionFooter(position)) {
return VIEW_TYPE_LOADING;
}else if(filter.equals("") && position == 0 && isWorkshop ){
ParseObject parseObject = arrayList.get(0);
if(parseObject.has("isBanner")&& parseObject.getBoolean("isBanner")== true){
return TYPE_HEADER;
}
}
return VIEW_TYPE_ITEM;
}
private boolean isPositionFooter(int position) {
return position == arrayList.size();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.order_view_list, parent, false);
return new MemberViewHolder(view, onItemClickListener);
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
final ParseObject parseObject = arrayList.get(position);
final CartUtils cartUtils = cartUtilsItemsList.get(position);
if(holder instanceof MemberViewHolder){
if (arrayList.size() > 0) {
// ---------------- Rating Block Start -----------------
((MemberViewHolder) holder).ratingBar.setEnabled(true);
RatingBar.OnRatingBarChangeListener l=
new RatingBar.OnRatingBarChangeListener() {
public void onRatingChanged(RatingBar ratingBar,
float rating, boolean fromTouch) {
// This method is calling again and again when I am scrolling
dialogBoxRating(parseObject,rating);
}
};
((MemberViewHolder) holder).ratingBar.setOnRatingBarChangeListener(l);
// Listeners Block End
}
}
}
public void dialogBoxRating(final ParseObject pObject, final double ratingStar){
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int choice) {
switch (choice) {
case DialogInterface.BUTTON_POSITIVE:
Toast.message("saved");
break;
case DialogInterface.BUTTON_NEGATIVE:
break;
}
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(R.string.do_you_want_to_save_the_rating).setTitle(R.string.cancel)
.setPositiveButton(R.string.yes, dialogClickListener)
.setNegativeButton(R.string.no, dialogClickListener).show();
}
@Override
public int getItemCount() {
return arrayList == null ? 0 : arrayList.size();
}
static class MemberViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
RatingBar ratingBar;
public MemberViewHolder(View itemView, OnItemClickListener onItemClickListener) {
super(itemView);
ratingBar= (RatingBar) itemView.findViewById(R.id.ratingBar);
itemView.setOnClickListener(this);
this.onItemClickListener = onItemClickListener;
}
@Override
public void onClick(View v) {
}
}
}
我的问题通过检查布尔值 'fromTouch' 得到解决。它是来自 onTouch 事件的评分栏侦听器的变量。如果不触摸,它会给出错误的价值,而在触摸时会给出真实的价值。我做了以下代码,它现在终于可以工作了。
ratingBar= (RatingBar) itemView.findViewById(R.id.ratingBar);
itemView.setOnClickListener(this);
this.onItemClickListener = onItemClickListener;
//should set listener here
RatingBar.OnRatingBarChangeListener l=
new RatingBar.OnRatingBarChangeListener() {
public void onRatingChanged(RatingBar ratingBar,
float rating, boolean fromTouch) {
if(fromTouch == true){
dialogBoxRating(parseObject,rating);
}
}
};
ratingBar.setOnRatingBarChangeListener(l);
我在 RecyclerView 上工作,我的视图上有 ratindBar。问题是当我向下滚动时,我的 RatingBar 侦听器一次又一次地调用。我在下面提供适配器 class 代码。我有一个方法在我滚动时调用多次,实际上它必须只在我触摸评级栏时调用。
提前致谢。
public class Order_Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Filterable {
public void setiCartListener(ICart iCartListener) {
this.iCartListener = iCartListener;
}
private OnItemClickListener onItemClickListener;
@Override
public int getItemViewType(int position) {
if (isPositionFooter(position)) {
return VIEW_TYPE_LOADING;
}else if(filter.equals("") && position == 0 && isWorkshop ){
ParseObject parseObject = arrayList.get(0);
if(parseObject.has("isBanner")&& parseObject.getBoolean("isBanner")== true){
return TYPE_HEADER;
}
}
return VIEW_TYPE_ITEM;
}
private boolean isPositionFooter(int position) {
return position == arrayList.size();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.order_view_list, parent, false);
return new MemberViewHolder(view, onItemClickListener);
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
final ParseObject parseObject = arrayList.get(position);
final CartUtils cartUtils = cartUtilsItemsList.get(position);
if(holder instanceof MemberViewHolder){
if (arrayList.size() > 0) {
// ---------------- Rating Block Start -----------------
((MemberViewHolder) holder).ratingBar.setEnabled(true);
RatingBar.OnRatingBarChangeListener l=
new RatingBar.OnRatingBarChangeListener() {
public void onRatingChanged(RatingBar ratingBar,
float rating, boolean fromTouch) {
// This method is calling again and again when I am scrolling
dialogBoxRating(parseObject,rating);
}
};
((MemberViewHolder) holder).ratingBar.setOnRatingBarChangeListener(l);
// Listeners Block End
}
}
}
public void dialogBoxRating(final ParseObject pObject, final double ratingStar){
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int choice) {
switch (choice) {
case DialogInterface.BUTTON_POSITIVE:
Toast.message("saved");
break;
case DialogInterface.BUTTON_NEGATIVE:
break;
}
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(R.string.do_you_want_to_save_the_rating).setTitle(R.string.cancel)
.setPositiveButton(R.string.yes, dialogClickListener)
.setNegativeButton(R.string.no, dialogClickListener).show();
}
@Override
public int getItemCount() {
return arrayList == null ? 0 : arrayList.size();
}
static class MemberViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
RatingBar ratingBar;
public MemberViewHolder(View itemView, OnItemClickListener onItemClickListener) {
super(itemView);
ratingBar= (RatingBar) itemView.findViewById(R.id.ratingBar);
itemView.setOnClickListener(this);
this.onItemClickListener = onItemClickListener;
}
@Override
public void onClick(View v) {
}
}
}
我的问题通过检查布尔值 'fromTouch' 得到解决。它是来自 onTouch 事件的评分栏侦听器的变量。如果不触摸,它会给出错误的价值,而在触摸时会给出真实的价值。我做了以下代码,它现在终于可以工作了。
ratingBar= (RatingBar) itemView.findViewById(R.id.ratingBar);
itemView.setOnClickListener(this);
this.onItemClickListener = onItemClickListener;
//should set listener here
RatingBar.OnRatingBarChangeListener l=
new RatingBar.OnRatingBarChangeListener() {
public void onRatingChanged(RatingBar ratingBar,
float rating, boolean fromTouch) {
if(fromTouch == true){
dialogBoxRating(parseObject,rating);
}
}
};
ratingBar.setOnRatingBarChangeListener(l);