多次调用获取视图
Get view is called multiple times
以下是我的适配器方法,
public class StatusAdapter extends BaseAdapter {
private Context mContext;
private View view;
private ViewHolder mViewHolder;
private LayoutInflater layoutInflater;
private ArrayList<ShipmentMasterDao> listForView;
public StatusAdapter(Context mContext, ArrayList list) {
super();
mContext = mContext;
listForView = list;
layoutInflater = LayoutInflater.from(mContext);
}
@Override
public int getCount() {
return listForView.size();
}
@Override
public Object getItem(int position) {
return listForView.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getViewTypeCount() {
return 2;
}
//Viewholder class to contain inflated xml views
private class ViewHolder {
private TextView mstatus, mDate;
private ImageView image;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
view = convertView;
if (convertView == null || mViewHolder != null) {
//inflate the view for each row of listview
view = layoutInflater.inflate(R.layout.status_progress, null);
//ViewHolder object to contain myadapter.xml elements
mViewHolder = new ViewHolder();
mViewHolder.image = (ImageView) view.findViewById(R.id.progressIcon);
mViewHolder.mDate = (TextView) view.findViewById(R.id.date);
mViewHolder.mstatus = (TextView) view.findViewById(R.id.status);
view.setTag(mViewHolder);
} else {
mViewHolder = (ViewHolder) view.getTag();
}
ShipmentMasterDao item = (ShipmentMasterDao) listForView.get(position);
mViewHolder.mstatus.setText(item.getStatus());
mViewHolder.mDate.setText(item.get_date());
mViewHolder.mDate.setVisibility(View.VISIBLE);
return view;
}
}
在 onViewCreated 方法中,我按如下方式设置适配器,
adapter = new StatusAdapter(getActivity().getApplicationContext(), masterItems);
mListView.setAdapter(adapter);
adapter.notifyDataSetChanged();
问题是 getView 被多次调用 times.How 我可以解决这个问题吗?无论如何,我可以在添加新元素之前重置我的 ui 吗?因为 getView 被多次调用,ui 被多次更新为相同的值
查看您的代码:
@Override
public int getCount() {
return listForView.size();
}
getView() 迭代基于您的列表大小。
如果只想迭代一次,请设置一个静态整数。
@Override
public int getCount() {
return 1; // Just one getView() iteration
}
但这不是适配器的最佳实践
getView() 方法不是父迭代。
这是您列表中的项目,您可以使用它为列表中的每个项目创建视图。
为列表的每个项目调用获取视图,您无需解决此问题,要优化列表视图,您可以尝试 ViewHolder 模式 (example)
以下是我的适配器方法,
public class StatusAdapter extends BaseAdapter {
private Context mContext;
private View view;
private ViewHolder mViewHolder;
private LayoutInflater layoutInflater;
private ArrayList<ShipmentMasterDao> listForView;
public StatusAdapter(Context mContext, ArrayList list) {
super();
mContext = mContext;
listForView = list;
layoutInflater = LayoutInflater.from(mContext);
}
@Override
public int getCount() {
return listForView.size();
}
@Override
public Object getItem(int position) {
return listForView.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getViewTypeCount() {
return 2;
}
//Viewholder class to contain inflated xml views
private class ViewHolder {
private TextView mstatus, mDate;
private ImageView image;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
view = convertView;
if (convertView == null || mViewHolder != null) {
//inflate the view for each row of listview
view = layoutInflater.inflate(R.layout.status_progress, null);
//ViewHolder object to contain myadapter.xml elements
mViewHolder = new ViewHolder();
mViewHolder.image = (ImageView) view.findViewById(R.id.progressIcon);
mViewHolder.mDate = (TextView) view.findViewById(R.id.date);
mViewHolder.mstatus = (TextView) view.findViewById(R.id.status);
view.setTag(mViewHolder);
} else {
mViewHolder = (ViewHolder) view.getTag();
}
ShipmentMasterDao item = (ShipmentMasterDao) listForView.get(position);
mViewHolder.mstatus.setText(item.getStatus());
mViewHolder.mDate.setText(item.get_date());
mViewHolder.mDate.setVisibility(View.VISIBLE);
return view;
}
}
在 onViewCreated 方法中,我按如下方式设置适配器,
adapter = new StatusAdapter(getActivity().getApplicationContext(), masterItems);
mListView.setAdapter(adapter);
adapter.notifyDataSetChanged();
问题是 getView 被多次调用 times.How 我可以解决这个问题吗?无论如何,我可以在添加新元素之前重置我的 ui 吗?因为 getView 被多次调用,ui 被多次更新为相同的值
查看您的代码:
@Override
public int getCount() {
return listForView.size();
}
getView() 迭代基于您的列表大小。 如果只想迭代一次,请设置一个静态整数。
@Override
public int getCount() {
return 1; // Just one getView() iteration
}
但这不是适配器的最佳实践
getView() 方法不是父迭代。 这是您列表中的项目,您可以使用它为列表中的每个项目创建视图。
为列表的每个项目调用获取视图,您无需解决此问题,要优化列表视图,您可以尝试 ViewHolder 模式 (example)