适配器不更新附加视图的条件是什么
What are the conditions under which an adapter doesn't update attached view
我正在使用这个库来创建可刷卡的卡片:https://github.com/Diolor/Swipecards
使可刷卡控制的视图附加到适配器并从中获取它的来源。
在我的实现中,每张卡片都有一个按钮,当它被点击时,源数组中的一些东西会发生变化,为此我想刷新整个卡片列表。我在关联的适配器上调用了 notifyDataSetChanged()
,但从未在适配器中调用 getView()
来查看任何更新。
奇怪的是,同一个适配器与 ListView 完美配合
适配器方面或视图本身是否有任何特定要求才能正常运行 notifyDataSetChanged?
我的代码:
(请忽略 ViewHolder 模式的缺失和适配器内部点击接收器的存在。当关键功能不起作用时,代码质量是我现在最不关心的事情)
适配器(使用阵列适配器)
public class TourCardAdapter extends ArrayAdapter<TourCardBean> implements View.OnClickListener {
Context context;
ToursFragment.ToursControlsClickListener clickListener;
public TourCardAdapter(Context context, ArrayList<TourCardBean> tourCardsArr, ToursFragment.ToursControlsClickListener clickListener) {
super(context, 0, tourCardsArr);
this.context = context;
this.clickListener = clickListener;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
ViewHolder viewHolder;
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
TourCardBean tourCard = getItem(position);
rowView = inflater.inflate(R.layout.card_tour, parent, false);
viewHolder = new ViewHolder();
viewHolder.title = (TextView) rowView
.findViewById(R.id.title);
viewHolder.detail = (TextView) rowView
.findViewById(R.id.detail);
viewHolder.likeCount = (TextView) rowView
.findViewById(R.id.likeCount);
viewHolder.image = (ImageView) rowView
.findViewById(R.id.cardLocationImage);
viewHolder.likeButton = (ImageView) rowView
.findViewById(R.id.cardLikeImage);
viewHolder.shareButton = (ImageView) rowView
.findViewById(R.id.cardShareImage);
viewHolder.likeButton.setOnClickListener(this);
viewHolder.shareButton.setOnClickListener(this);
viewHolder.title.setText(tourCard.getTitle());
viewHolder.detail.setText(tourCard.getDetails());
viewHolder.likeCount.setText("" + tourCard.getLikeCount());
viewHolder.likeButton.setTag(tourCard.getId());
viewHolder.shareButton.setTag(tourCard.getId());
return rowView;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.cardLikeImage:
clickListener.onLikeClick((int) v.getTag());
break;
case R.id.cardShareImage:
clickListener.onShareClick((int) v.getTag());
break;
}
}
/**
* View Holder for ListView
*
* @author Aman Alam
*/
class ViewHolder {
public ImageView image;
public ImageView likeButton;
public ImageView shareButton;
public TextView title;
public TextView detail;
public TextView likeCount;
}
}
库可能非常有用,但我认为使用 google 提供的支持库是明智的。
material 设计的最新更新发布后,您将受益匪浅。
您可以在 gradle 文件中声明。这;
compile 'com.android.support:design:22.2.0'
如果它适用于 ListView
,您的适配器应该不是问题。
SwipeFlingAdapterView
(或多或少)直接基于根本不调用 getView()
的 AdapterView
。因此,它有责任在数据集更改时调用 getView()
。代码的相关部分似乎是,可能会被您的点击事件阻止:
if (this.flingCardListener.isTouching()) {
PointF lastPoint = this.flingCardListener.getLastPoint();
if (this.mLastTouchPoint == null || !this.mLastTouchPoint.equals(lastPoint)) {
this.mLastTouchPoint = lastPoint;
removeViewsInLayout(0, LAST_OBJECT_IN_STACK);
layoutChildren(1, adapterCount);
}
}
总体而言,SwipeFlingAdapterView
似乎根本没有为数据集更改事件做好准备。
根据针对 Swipecards 库记录的一些问题,它似乎存在错误,无法更新 notifyDataSetChanged()
上的视图。 This one 有几个可能适合您的解决方法。具体来说,flingContainer.removeAllViewsInLayout()
.
我正在使用这个库来创建可刷卡的卡片:https://github.com/Diolor/Swipecards
使可刷卡控制的视图附加到适配器并从中获取它的来源。
在我的实现中,每张卡片都有一个按钮,当它被点击时,源数组中的一些东西会发生变化,为此我想刷新整个卡片列表。我在关联的适配器上调用了 notifyDataSetChanged()
,但从未在适配器中调用 getView()
来查看任何更新。
奇怪的是,同一个适配器与 ListView 完美配合
适配器方面或视图本身是否有任何特定要求才能正常运行 notifyDataSetChanged?
我的代码:
(请忽略 ViewHolder 模式的缺失和适配器内部点击接收器的存在。当关键功能不起作用时,代码质量是我现在最不关心的事情)
适配器(使用阵列适配器)
public class TourCardAdapter extends ArrayAdapter<TourCardBean> implements View.OnClickListener {
Context context;
ToursFragment.ToursControlsClickListener clickListener;
public TourCardAdapter(Context context, ArrayList<TourCardBean> tourCardsArr, ToursFragment.ToursControlsClickListener clickListener) {
super(context, 0, tourCardsArr);
this.context = context;
this.clickListener = clickListener;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
ViewHolder viewHolder;
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
TourCardBean tourCard = getItem(position);
rowView = inflater.inflate(R.layout.card_tour, parent, false);
viewHolder = new ViewHolder();
viewHolder.title = (TextView) rowView
.findViewById(R.id.title);
viewHolder.detail = (TextView) rowView
.findViewById(R.id.detail);
viewHolder.likeCount = (TextView) rowView
.findViewById(R.id.likeCount);
viewHolder.image = (ImageView) rowView
.findViewById(R.id.cardLocationImage);
viewHolder.likeButton = (ImageView) rowView
.findViewById(R.id.cardLikeImage);
viewHolder.shareButton = (ImageView) rowView
.findViewById(R.id.cardShareImage);
viewHolder.likeButton.setOnClickListener(this);
viewHolder.shareButton.setOnClickListener(this);
viewHolder.title.setText(tourCard.getTitle());
viewHolder.detail.setText(tourCard.getDetails());
viewHolder.likeCount.setText("" + tourCard.getLikeCount());
viewHolder.likeButton.setTag(tourCard.getId());
viewHolder.shareButton.setTag(tourCard.getId());
return rowView;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.cardLikeImage:
clickListener.onLikeClick((int) v.getTag());
break;
case R.id.cardShareImage:
clickListener.onShareClick((int) v.getTag());
break;
}
}
/**
* View Holder for ListView
*
* @author Aman Alam
*/
class ViewHolder {
public ImageView image;
public ImageView likeButton;
public ImageView shareButton;
public TextView title;
public TextView detail;
public TextView likeCount;
}
}
库可能非常有用,但我认为使用 google 提供的支持库是明智的。
material 设计的最新更新发布后,您将受益匪浅。
您可以在 gradle 文件中声明。这;
compile 'com.android.support:design:22.2.0'
如果它适用于 ListView
,您的适配器应该不是问题。
SwipeFlingAdapterView
(或多或少)直接基于根本不调用 getView()
的 AdapterView
。因此,它有责任在数据集更改时调用 getView()
。代码的相关部分似乎是,可能会被您的点击事件阻止:
if (this.flingCardListener.isTouching()) {
PointF lastPoint = this.flingCardListener.getLastPoint();
if (this.mLastTouchPoint == null || !this.mLastTouchPoint.equals(lastPoint)) {
this.mLastTouchPoint = lastPoint;
removeViewsInLayout(0, LAST_OBJECT_IN_STACK);
layoutChildren(1, adapterCount);
}
}
总体而言,SwipeFlingAdapterView
似乎根本没有为数据集更改事件做好准备。
根据针对 Swipecards 库记录的一些问题,它似乎存在错误,无法更新 notifyDataSetChanged()
上的视图。 This one 有几个可能适合您的解决方法。具体来说,flingContainer.removeAllViewsInLayout()
.