Android 更改文本视图的文本,该文本视图为';通过按下同一适配器内的按钮,可以在阵列适配器内安装
这是我在stackoverflow的第一个问题。 如果我做错了,请纠正我。 所以我们开始: 我试图在ArrayAdapter中创建一个按钮的onClickListener,该按钮在同一布局中更改TextView的文本。但实际情况是:当我单击按钮时,它会更改多个TextView的文本。 它是这样的:如果我按下列表的第一个按钮,它会改变5h、9th、13th的文本。。。。。为什么会这样 我希望有一个onClickListener来更改位于samelayout上的TextView的文本 PS:当我说“按钮”时,它实际上是一个“图像视图” 适配器的代码:Android 更改文本视图的文本,该文本视图为';通过按下同一适配器内的按钮,可以在阵列适配器内安装,android,android-arrayadapter,clicklistener,Android,Android Arrayadapter,Clicklistener,这是我在stackoverflow的第一个问题。 如果我做错了,请纠正我。 所以我们开始: 我试图在ArrayAdapter中创建一个按钮的onClickListener,该按钮在同一布局中更改TextView的文本。但实际情况是:当我单击按钮时,它会更改多个TextView的文本。 它是这样的:如果我按下列表的第一个按钮,它会改变5h、9th、13th的文本。。。。。为什么会这样 我希望有一个onClickListener来更改位于samelayout上的TextView的文本 PS:当我说“
public class ProductAdapter extends ArrayAdapter<Produtc> {
public ProductAdapter (Context context, ArrayList<Product> products) {
super(context, 0, products);
}
@Override
public View getView (final int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
final Product product = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.layout_sliders, parent, false);
viewHolder = new ViewHolder();
viewHolder.textViewProductIndex = (TextView) convertView.findViewById(R.id.textViewIndex);
viewHolder.textViewProductName = (TextView) convertView.findViewById(R.id.textViewProductName);
viewHolder.textViewQuantity = (TextView) convertView.findViewById(R.id.textViewQuantity);
viewHolder.imageViewADD = (ImageView) convertView.findViewById(R.id.buttonAdd);
viewHolder.imageViewFILL = (ImageView) convertView.findViewById(R.id.buttonFill);
viewHolder.imageViewCheck = (ImageView) convertView.findViewById(R.id.buttonCheck);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
if (produto != null) {
viewHolder.textViewProductIndex.setText(product.getProductIndex());
viewHolder.textViewProductName.setText(product.getProductName());
viewHolder.imageViewADD.setTag(position);
viewHolder.imageViewFILL.setTag(position);
viewHolder.imageViewCheck.setTag(position);
viewHolder.textViewProductIndex.setTag(position);
viewHolder.textViewProductName.setTag(position);
viewHolder.textViewQuantity.setTag(position);
viewHolder.imageViewADD.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewHolder.textViewQuantity.setText("TESTING");
}
});
}
return convertView;
}
class ViewHolder {
private TextView textViewProductIndex;
private TextView textViewProductName;
private TextView textViewQuantity;
private ImageView imageViewADD;
private ImageView imageViewFILL;
private ImageView imageViewCheck;
}}
公共类ProductAdapter扩展了ArrayAdapter{
公共产品适配器(上下文、ArrayList产品){
超级(上下文,0,产品);
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
最终持票人;
最终产品=getItem(位置);
if(convertView==null){
convertView=LayoutInflater.from(getContext()).flate(R.layout.layout_滑块,父项,false);
viewHolder=新的viewHolder();
viewHolder.textViewProductIndex=(TextView)convertView.findViewById(R.id.textViewIndex);
viewHolder.textViewProductName=(TextView)convertView.findViewById(R.id.textViewProductName);
viewHolder.textViewQuantity=(TextView)convertView.findViewById(R.id.textViewQuantity);
viewHolder.imageViewADD=(ImageView)convertView.findViewById(R.id.ButtonAddd);
viewHolder.imageViewFILL=(ImageView)convertView.findViewById(R.id.buttonFill);
viewHolder.imageViewCheck=(ImageView)convertView.findViewById(R.id.buttonCheck);
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
if(produto!=null){
viewHolder.textViewProductIndex.setText(product.getProductIndex());
viewHolder.textViewProductName.setText(product.getProductName());
viewHolder.imageViewADD.setTag(位置);
viewHolder.imageViewFILL.setTag(位置);
viewHolder.imageViewCheck.setTag(位置);
viewHolder.textViewProductIndex.setTag(位置);
viewHolder.textViewProductName.setTag(位置);
viewHolder.textViewQuantity.setTag(位置);
viewHolder.imageViewADD.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
viewHolder.textViewQuantity.setText(“测试”);
}
});
}
返回视图;
}
类视图持有者{
私有文本视图文本视图产品索引;
私有TextView textViewProductName;
私有文本视图文本视图数量;
私有ImageView imageViewADD;
私有ImageView imageViewFILL;
私有ImageView imageViewCheck;
}}
其他疑问:
-我必须在setTag()上传递什么
-我是否应该在ListView的onItemClickListener上的setapAdapter之后处理clickListeners?欢迎使用StackOverflow 这是因为列表视图正在重用视图以提高性能。所以第1、5、9视图实际上是相同的。当您执行
viewHolder=(viewHolder)convertView.getTag()时代码>您正在重用现有视图,而不是创建新视图,这有利于提高性能。您还避免了findViewById
调用
要解决问题,应该在每次getView()调用上设置quantity
文本。类似于viewHolder.textViewQuantity.setText(product.getQuantity())
。这将覆盖当前文本
至于setTag
,它用于存储带有视图的任意对象,以便以后可以获取。这用于实现ViewHolder模式,但也有其他用途。不需要对视图持有者的每个属性调用setTag,只需要convertView.setTag(viewHolder)代码>我会这样做:
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class ProductAdapter extends ArrayAdapter<Product> {
private Context mContext;
private ArrayList<Product> mProducts;
public ProductAdapter(Context context, ArrayList<Product> products) {
super(context, 0, products);
this.mContext = context;
this.mProducts = products;
}
public class ViewHolder {
private final TextView textViewProductIndex;
private final TextView textViewProductName;
private final TextView textViewQuantity;
private final ImageView imageViewADD;
private final ImageView imageViewFILL;
private final ImageView imageViewCheck;
public ViewHolder(View v, final int position) {
this.mTextViewProductIndex = (TextView) v.findViewById(R.id.textViewIndex);
this.mTextViewProductName = (TextView) v.findViewById(R.id.textViewProductName);
this.mTextViewQuantity = (TextView) v.findViewById(R.id.textViewQuantity);
this.mImageViewADD = (ImageView) v.findViewById(R.id.buttonAdd);
this.mImageViewFILL = (ImageView) v.findViewById(R.id.buttonFill);
this.mImageViewCheck = (ImageView) v.findViewById(R.id.buttonCheck);
}
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = mContext.getLayoutInflater();
rowView = inflater.inflate(R.layout.layout_sliders, parent);
ViewHolder viewHolder = new ViewHolder(rowView, position);
rowView.setTag(viewHolder);
}
final ViewHolder holder = (ViewHolder) rowView.getTag();
holder.textViewProductIndex.setText(mProducts.get(position).getProductIndex());
holder.textViewProductName.setText(mProducts.get(position).getProductName());
holder.textViewQuantity.setText(mProducts.get(position).getQuantity());
holder.imageViewADD.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.textViewQuantity.setText("TESTING");
}
});
return rowView;
}
}
导入android.content.Context;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.ImageView;
导入android.widget.TextView;
公共类ProductAdapter扩展了ArrayAdapter{
私有上下文;
私有ArrayList MPProducts;
公共产品适配器(上下文、ArrayList产品){
超级(上下文,0,产品);
this.mContext=上下文;
this.mProducts=产品;
}
公共类视图持有者{
私有最终文本视图文本视图产品索引;
私有最终TextView textViewProductName;
私有最终文本视图文本视图数量;
私有最终图像视图图像视图添加;
私有最终ImageView imageViewFILL;
私人最终图像查看图像查看检查;
公共视图持有者(视图v,最终int位置){
this.mTextViewProductIndex=(TextView)v.findViewById(R.id.textViewIndex);
this.mTextViewProductName=(TextView)v.findViewById(R.id.textViewProductName);
this.mTextViewQuantity=(TextView)v.findViewById(R.id.textViewQuantity);
this.mImageViewADD=(ImageView)v.findviewbyd(R.id.buttonAdd);
this.mImageViewFILL=(ImageView)v.findViewById(R.id.buttonFill);
this.mimageview检查=(ImageView)v.findViewById(R.id.buttonCheck);
}
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视图行视图=转换视图;
if(rowView==null){
LayoutInflater充气器=mContext.getLayoutInflater();
rowView=充气机。充气(R.layout.layout\u滑块,父级);
ViewHolder ViewHolder=新的ViewHolder(行视图,位置);
rowView.setT