提问人:Pranjal 提问时间:6/18/2018 更新时间:6/18/2018 访问量:911
Android- ListView 适配器未返回正确的位置
android- listview adapter not returning correct position
问:
我的列表视图有一个行文件,它有 3 个元素。行左侧的名称。一个 Imageview(指示进入下一页的右箭头)和一个主要的 LinearLayout,我在其中放置了这些项目。
这是我的适配器的getView()方法。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null){
convertView=LayoutInflater.from(context).inflate(R.layout.activity_row_mail_category,null);
holder=new Holder();
setView(convertView,position);
convertView.setTag(holder);
}
else {
holder= (Holder) convertView.getTag();
setView(convertView,position);
}
holder.Name.setText(mailCategoryArrayList.get(position).getCat_name());
return convertView;
}
Holder 是我在 adpater 本身中创建的静态类。
static class Holder{
TextView Name;
ImageView next;
LinearLayout mainLayout;
}
这是我从 getView 调用的 setView 方法
private void setView(final View convertView,final int position) {
holder.Name = (TextView) convertView.findViewById(R.id.listview_row_title);
holder.next = (ImageView) convertView.findViewById(R.id.next);
holder.main = (LinearLayout) convertView.findViewById(R.id.main);
holder.next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view)
Log.e("tag","Position:"+position);
}
});
holder.mailCategoryMain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
holder.next.performClick();
});
每当我运行应用程序并单击布局时,我都会获得该位置作为我的 arrayList 的最后一个索引,但是当我单击图像视图时,我会得到正确的位置。那么 performClick() 函数有什么问题,为什么当我简单地告诉 android 以编程方式而不是手动单击图像视图时会发生这种情况?
答:
0赞
Benkerroum Mohamed
6/18/2018
#1
初始化你的内部函数将解决问题holder
setView()
private void setView(final View convertView,final int position) {
Holder holder = new holder();
holder.Name = (TextView) convertView.findViewById(R.id.listview_row_title);
holder.next = (ImageView) convertView.findViewById(R.id.next);
holder.main = (LinearLayout) convertView.findViewById(R.id.main);
holder.next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view)
Log.e("tag","Position:"+position);
}
});
holder.mailCategoryMain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
holder.next.performClick();
});
在您的代码上使用相同的代码,它保存了最后一个值,希望这会有所帮助instance
holder
0赞
Rajesh
6/18/2018
#2
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder;
if(convertView==null){
convertView=LayoutInflater.from(context)
.inflate(R.layout.activity_row_mail_category,null);
holder=new Holder();
holder.Name.setText(mailCategoryArrayList.get(position).getCat_name());
holder.Name = (TextView) convertView.findViewById(R.id.listview_row_title);
holder.next = (ImageView) convertView.findViewById(R.id.next);
holder.main = (LinearLayout) convertView.findViewById(R.id.main);
convertView.setTag(holder);
}else {
holder= (Holder) convertView.getTag();
}
holder.next.setTag(position);//To avoid finalize
holder.next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view)
Integer pos=(Integer)view.getTag();
Log.e("tag","Position:"+pos);
}
});
holder.mailCategoryMain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
holder.next.performClick();
});
return convertView;
}
评论