Android 在自定义listView中单击一次修改按钮

Android 在自定义listView中单击一次修改按钮,android,listview,button,onclicklistener,android-custom-view,Android,Listview,Button,Onclicklistener,Android Custom View,我已经做了一个自定义的ListView,我希望能够单击一个小按钮或整行。所以我为这两个案例制作了两个独立的onclick监听器。如何引用按钮?它给了我这个错误: Cannot refer to a non-final variable viewHolder inside an inner class defined in a different method 我不能把它定下来,因为它不断地变化。 这是我的密码 public class ListViewAdapter extends A

我已经做了一个自定义的ListView,我希望能够单击一个小按钮或整行。所以我为这两个案例制作了两个独立的onclick监听器。如何引用按钮?它给了我这个错误:

Cannot refer to a non-final variable viewHolder inside an inner class defined in a different method
我不能把它定下来,因为它不断地变化。 这是我的密码

    public class ListViewAdapter extends ArrayAdapter<String> {

        private static LayoutInflater inflater = null;

        public Context context; 
        public int layoutResourceId;
        public ArrayList<HashMap<String, Object>> items;
        public Bitmap icon;
        private static int REFRESH_THRESHOLD = 2;

        //public ImageLoader imageLoader;

        public ListViewAdapter(Context context, int listviewItemRow, ArrayList<HashMap<String, Object>> items, Bitmap icon) {
            // TODO Auto-generated constructor stub
            super(context, listviewItemRow);
            this.items = items;
            this.context = context;
            this.icon = icon;
        }

        public int getCount() {
            return items.size();
        }

        public Item getItem(Item position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            View row = convertView;
            ViewHolder viewHolder = new ViewHolder();

            if (row == null) {

                inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                row = inflater.inflate(R.layout.listview_item_row, null);       

                viewHolder.ic_thumbnail = (ImageView)row.findViewById(R.id.ic_thumbnail);
                viewHolder.scadenza = (TextView)row.findViewById(R.id.tvScadenza);
                viewHolder.prezzo = (TextView)row.findViewById(R.id.tvPrezzo);
                viewHolder.followers = (TextView)row.findViewById(R.id.tvFollowers);
                viewHolder.hProgressBar = (ProgressBar)row.findViewById(R.id.hProgressBar);
                viewHolder.followButton = (Button) row.findViewById(R.id.btnFollow);

                row.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder)row.getTag();
            }

            HashMap<String, Object> item = items.get(position);
            viewHolder.ic_thumbnail.setImageBitmap((Bitmap) item.get("pic1m"));
            viewHolder.scadenza.setText((CharSequence) item.get("scadenza"));
            viewHolder.prezzo.setText((CharSequence) item.get("prezzo"));
            viewHolder.followers.setText((CharSequence) item.get("followers"));
            viewHolder.hProgressBar.setProgress((Integer) item.get("coefficient"));
            viewHolder.followButton.setText("non segui");
            viewHolder.followButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
//here i get the error
                    viewHolder.followButton = (Button) row.findViewById(R.drawable.action_object_button_gray);
                    followButton.setText("segui");
                }
            });


            row.setOnClickListener(new OnItemClickListener(position));


            return row;
        }

        private class OnItemClickListener implements OnClickListener {

            private int mPosition;

            private OnItemClickListener(int position){
                mPosition = position;
            }

            @Override
            public void onClick(View v) {

                Log.i("onListItemClickList", "Item clicked: " + mPosition);
                Toast.makeText(context, "Message " + Integer.toString(mPosition), Toast.LENGTH_SHORT).show();

                Intent intent = new Intent(context, DettagliActivity.class);
                Bundle bundle = new Bundle();
                bundle.putInt("id", mPosition);
                intent.putExtras(bundle);
                context.startActivity(intent);
            }   
        }

        public static class ViewHolder {
            public TextView prezzo;
            public TextView scadenza;
            public TextView followers;
            public ImageView ic_thumbnail;
            public ProgressBar hProgressBar;
            public Button followButton;
        }
    }
公共类ListViewAdapter扩展了ArrayAdapter{
专用静态充气机=空;
公共语境;
公共内部布局资源;
公共阵列列表项;
公共位图图标;
私有静态int刷新_阈值=2;
//公共图像加载器;
公共ListViewAdapter(上下文上下文、int listviewItemRow、ArrayList项、位图图标){
//TODO自动生成的构造函数存根
超级(上下文,listviewItemRow);
这个项目=项目;
this.context=上下文;
this.icon=图标;
}
public int getCount(){
返回items.size();
}
公共项目getItem(项目位置){
返回位置;
}
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视图行=转换视图;
ViewHolder ViewHolder=新ViewHolder();
if(行==null){
充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
行=充气机。充气(R.layout.listview\u item\u行,空);
viewHolder.ic_缩略图=(ImageView)row.findViewById(R.id.ic_缩略图);
viewHolder.scadenza=(TextView)row.findViewById(R.id.tvScadenza);
viewHolder.prezzo=(TextView)row.findViewById(R.id.tvPrezzo);
viewHolder.followers=(TextView)row.findViewById(R.id.tvFollowers);
viewHolder.hProgressBar=(ProgressBar)row.findViewById(R.id.hProgressBar);
viewHolder.followButton=(按钮)row.findViewById(R.id.btnFollow);
row.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)row.getTag();
}
HashMap item=items.get(位置);
viewHolder.ic_缩略图.setImageBitmap((位图)项.get(“pic1m”);
viewHolder.scadenza.setText((CharSequence)item.get(“scadenza”));
viewHolder.prezzo.setText((CharSequence)item.get(“prezzo”);
viewHolder.followers.setText((CharSequence)item.get(“followers”);
viewHolder.hProgressBar.setProgress((整数)item.get(“系数”);
viewHolder.followButton.setText(“非segui”);
viewHolder.followButton.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
//这里我得到了错误
viewHolder.followButton=(按钮)row.findViewById(R.drawable.action\u object\u Button\u gray);
followButton.setText(“segui”);
}
});
row.setOnClickListener(新的McClickListener(位置));
返回行;
}
私有类OnItemClickListener实现OnClickListener{
私人投资;
专用侦听器(内部位置){
位置=位置;
}
@凌驾
公共void onClick(视图v){
Log.i(“onListItemClickList”,“单击的项目:+mPosition”);
Toast.makeText(上下文,“Message”+Integer.toString(mPosition),Toast.LENGTH_SHORT.show();
意向意向=新意向(上下文,DettagliActivity.class);
Bundle=新Bundle();
bundle.putInt(“id”,复合词);
意向。额外支出(捆绑);
背景。开始触觉(意图);
}   
}
公共静态类视图持有者{
公共文本视图预览;
公共文本视图scadenza;
公共文本视图关注者;
公共图像视图ic_缩略图;
公共ProgressBar HPProgressBar;
公共按钮跟随按钮;
}
}
而不是这个

viewHolder.followButton = (Button) row.findViewById(R.drawable.action_object_button_gray);
followButton.setText("segui");
你可以用

Buttom button =(Button)v; // casting view to button
button.setText("segui");  // set text to button 
如果在匿名内部类中使用变量,则要求该变量为final

参考文献

而不是这个

viewHolder.followButton = (Button) row.findViewById(R.drawable.action_object_button_gray);
followButton.setText("segui");
你可以用

Buttom button =(Button)v; // casting view to button
button.setText("segui");  // set text to button 
如果在匿名内部类中使用变量,则要求该变量为final

参考文献


既然要在感兴趣的按钮上设置onClickListener,为什么不将视图强制转换为按钮并使用view参数修改它呢

viewHolder.followButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
//here i get the error
                    Button view = (Button) v;
                    view.setText("segui");
                }
            });

既然要在感兴趣的按钮上设置onClickListener,为什么不将视图强制转换为按钮并使用view参数修改它呢

viewHolder.followButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
//here i get the error
                    Button view = (Button) v;
                    view.setText("segui");
                }
            });
简单的解决办法是

final ViewHolder temp = viewHolder;
使用它。

简单的解决方案是

final ViewHolder temp = viewHolder;

然后使用它。

尝试将ViewHolder定义为Finary,将ViewHolder定义为Finaryfinal@Pheonix7理解为什么错误+1是因为参考文献和知识传播。非常非常有用@Pheonix7了解为什么错误+1是因为参考和知识传播。非常非常有用!它给了我错误,所以我使用View=(Button)v;((按钮)视图).setText(“segui”);现在它适用于捕捉我的打字错误的甲烷罐;((按钮)视图).setText(“segui”);现在它适用于我的打字错误。