因为使用 BaseAdapter 在网格视图中重复 textview 产品计数器
Posted
技术标签:
【中文标题】因为使用 BaseAdapter 在网格视图中重复 textview 产品计数器【英文标题】:Because textview product counter is repeated in grid view using BaseAdapter 【发布时间】:2018-02-21 17:33:53 【问题描述】:因为它重复了作为 TextView 的产品计数器;我有以下情况:
-
用户选择产品,应用数量。
从活动而不是适配器中,我显示了所选产品的数量,如图所示。
一切都很完美,直到屏幕下方和柜台神奇地转移到另一个产品,我已经通过建议实现了这些方法:
@Override
public long getItemId(int position)
return position;
@Override
public int getItemViewType(int position)
return position;
我仍然得到这个错误。我也尝试从适配器修改计数器,但同样的事情发生了。我希望该计数器在屏幕下保持固定而不更新。
适配器:
public class ProductoAdapter extends BaseAdapter
private Activity activity;
private LayoutInflater inflater;
private ArrayList<Producto> listadoProductos;
private ArrayList<Producto> productosPedidos;
Producto producto;
Empresas pedido;
public final int TYPE_NOTICIA=0;
public final int TYPE_LOAD=1;
private gestionSharedPreferences sharedPreferences;
private Context context;
/*
OnLoadMoreListener loadMoreListener;
*/
boolean isLoading=false, isMoreDataAvailable=true;
vars vars;
public static int contador;
public static int i;
public static int contadorGeneral;
private NumberFormat numberFormat;
ImageLoader imageLoader = ControllerSingleton.getInstance().getImageLoader();
public ProductoAdapter(Activity activity, ArrayList<Producto> listadoProductos)
this.activity=activity;
this.listadoProductos=listadoProductos;
productosPedidos=new ArrayList<Producto>();
vars=new vars();
sharedPreferences=new gestionSharedPreferences(this.activity);
contador=0;
contadorGeneral=0;
producto=new Producto();
/* LocalBroadcastManager.getInstance(context).registerReceiver(mMessageReceiver,
new IntentFilter("custom-message"));*/
/* public BroadcastReceiver mMessageReceiver = new BroadcastReceiver()
@Override
public void onReceive(Context context, Intent intent)
// Get extra data included in the Intent
producto = (Producto) intent.getSerializableExtra("producto");
Toast.makeText(context, producto.getNombreProducto()+producto.getNumeroDeProducto() ,Toast.LENGTH_SHORT).show();
;*/
@Override
public int getCount()
return listadoProductos.size();
@Override
public Producto getItem(int position)
return listadoProductos.get(position);
@Override
public long getItemId(int position)
return position;
@Override
public int getItemViewType(int position)
return position;
@Override
public View getView(int position, View view, ViewGroup viewGroup)
numberFormat = NumberFormat.getNumberInstance(Locale.GERMAN);
if (view == null)
LayoutInflater inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.producto_row_layout, viewGroup, false);
Log.i("martin","null");
else
Log.i("martin","llenoooooooooo");
final Producto producto = getItem(position);
ImageView imagenProducto = (ImageView) view.findViewById(R.id.imagenProducto);
TextView nombreProducto = (TextView) view.findViewById(R.id.nombreProducto);
TextView cantidadProducto = (TextView) view.findViewById(R.id.cantidadProducto);
TextView precioGeneralProducto = (TextView) view.findViewById(R.id.precioGeneralProducto);
TextView precioPideProducto = (TextView) view.findViewById(R.id.precioPideProducto);
TextView ahorroProducto = (TextView) view.findViewById(R.id.ahorroProducto);
if (producto.getImagenProducto().toString().equals("http://fasttrackcenter.com/pide/app/"))
imagenProducto.setImageResource(R.drawable.ic_not_image_found);
else
Glide.with(activity).
load(producto.getImagenProducto().toString()).
thumbnail(0.5f).into(imagenProducto);
nombreProducto.setText(producto.getNombreProducto()+" x "+producto.getCantidadProducto()+" "+producto.getUnidadProducto());
//cantidadProducto.setText(producto.getCantidadProducto());
precioGeneralProducto.setText("$"+numberFormat.format(Double.parseDouble(producto.getPrecioGeneralProducto())));
precioGeneralProducto.setPaintFlags(precioGeneralProducto.getPaintFlags()| Paint.STRIKE_THRU_TEXT_FLAG);
precioPideProducto.setText("$"+numberFormat.format(Double.parseDouble(producto.getPrecioPideProducto())));
int valorahorro=(Integer.parseInt(producto.getPrecioGeneralProducto()))-(Integer.parseInt(producto.getPrecioPideProducto()));
ahorroProducto.setText(""+"$"+numberFormat.format(Double.parseDouble(""+valorahorro)));
return view;
活动:
我使用 TextView 作为计数器,它最初是不可见的,但当它被选中时,它随着所选产品的数量而可见。
从我使用这种方法的活动中:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
Producto producto = (Producto) parent.getItemAtPosition(position);
final View contadorImagenProductoBolsa = Pedidos.this.findViewById(R.id.contadorProductoImagenBolsa);
TextView test1TextView = (TextView) view.findViewById(R.id.contadorProductoImagenBolsa);
mostrarDialogoDetalle(test1TextView,position,producto.getIdProducto(),producto.getImagenProducto(), producto.getNombreProducto(),
producto.getCantidadProducto(),producto.getUnidadProducto(), producto.getPrecioGeneralProducto(),producto.getPrecioPideProducto(),
producto.getAhorroProducto());
有人遇到过这种情况吗?他们是怎么解决的?
这里是完美的,但是当我从屏幕下方往回走时,观察计数器是如何莫名其妙地发生在另一个产品上的:
如果适配器或活动不正确,我需要有效的帮助和可能的 sn-p。
谢谢。
【问题讨论】:
您必须在单击时存储该特定位置。因此,当您滚动或移动该位置时,仅显示文本。发生这种情况是因为您的列表视图是重复使用单元格。 【参考方案1】:我认为你必须添加 ViewHolder For ProductoAdapter Like:
class ViewHolder
TextView nombreProducto,cantidadProducto
,precioGeneralProducto,precioPideProducto,ahorroProducto;
ImageView imagenProducto;
public ViewHolder(View view)
imagenProducto = (ImageView) view.findViewById(R.id.imagenProducto);
nombreProducto = (TextView) view.findViewById(R.id.nombreProducto);
cantidadProducto = (TextView) view.findViewById(R.id.cantidadProducto);
precioGeneralProducto = (TextView) view.findViewById(R.id.precioGeneralProducto);
precioPideProducto = (TextView) view.findViewById(R.id.precioPideProducto);
ahorroProducto = (TextView) view.findViewById(R.id.ahorroProducto);
使用 setTag 和 getTag For ViewHolder Like:
ViewHolder holder;
if (view == null)
LayoutInflater inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.producto_row_layout, viewGroup, false);
holder = new ViewHolder();
Log.i("martin","null");
else
holder = (ViewHolder) view.getTag();
Log.i("martin","llenoooooooooo");
final Producto producto = getItem(position);
if (producto.getImagenProducto().toString().equals("http://fasttrackcenter.com/pide/app/"))
holder.imagenProducto.setImageResource(R.drawable.ic_not_image_found);
else
Glide.with(activity).
load(producto.getImagenProducto().toString()).
thumbnail(0.5f).into(holder.imagenProducto);
holder.nombreProducto.setText(producto.getNombreProducto()+" x "+producto.getCantidadProducto()+" "+producto.getUnidadProducto());
.
.
.
view.setTag(holder);
return view;
希望对你有帮助
【讨论】:
以上是关于因为使用 BaseAdapter 在网格视图中重复 textview 产品计数器的主要内容,如果未能解决你的问题,请参考以下文章
Android - 带有自定义 BaseAdapter 的 Gridview,创建 onclicklistener [重复]