@Override
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
viewholder holder;
if(vi==null){
LayoutInflater inflater = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE);
vi = inflater.inflate(R.layout.row, null);
holder=new viewholder();
holder.tview1=(TextView)vi.findViewById(R.id.MXname);
holder.tview1.setOnClickListener(new OnClickListener(){
public void onClick(View v){
Log.d("Name view Click","in the list");
}
}
);
holder.tview2=(TextView)vi.findViewById(R.id.MXtnumber);
holder.tview2.setOnClickListener(new OnClickListener(){
public void onClick(View v){
Log.d("Number view Click","in the list"+position);
}
}
);
holder.imageview=(ImageView)vi.findViewById(R.id.MXdialer);
holder.imageview.setTag(position);
holder.imageview.setOnClickListener(new OnClickListener(){
public void onClick(View v){
//Integer no = new Integer(0);
// get the number to dial and pass to DialNo
//madapter.this.DialNo();
Log.d("Dialer view Click","in the list");
}
}
);
vi.setTag(holder);
}
else
holder=(viewholder)vi.getTag();
return vi;
}
}
}
请看上面与listview / android相关的getview()适配器代码的草案,当我尝试在上面的任何onclick方法中使用“position”参数时,我得到错误“不能引用非最终变量在以不同方法定义的内部类中的位置“ 我能做的唯一工作是将它作为最终变量,然后在onclick()方法中访问该最终变量。如果没有使用最终变量,请建议是否有其他方法。提前谢谢
答案 0 :(得分:1)
您可以将每个具有OnClickListener的子视图的标记设置为列表中父视图的位置。这样在您的OnClickListener中就可以调用
int pos = (int)view.getTag();
请记住,每次运行getView时都必须设置位置,而不仅仅是在充气期间,因为视图会被回收,所以它们的位置会发生变化。
答案 1 :(得分:0)
更改:
@Override
public View getView(int position,....
TO:
@Override
public View getView(final int position,
答案 2 :(得分:0)
如果您不想将该位置标记为最终位置,请将该位置设置为视图的标记:
holder.tview2.setTag(position);
holder.tview2.setOnClickListener(new OnClickListener(){
public void onClick(View v){
Log.d("Number view Click","in the list"+(String)v.getTag());
}
);
顺便说一句:您不应为列表的每个项目创建新的OnClickListener
。而是使用holder.tview2.setOnClickListener(this);
并在适配器上实现OnClickListener
。当然,对于您的所有TextView
和ImageView
。