getView()参数传入android适配器

时间:2013-06-24 14:46:24

标签: android

@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()方法中访问该最终变量。如果没有使用最终变量,请建议是否有其他方法。提前谢谢

3 个答案:

答案 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。当然,对于您的所有TextViewImageView