如何停止冻结listView

时间:2012-02-08 19:49:14

标签: android listview

我有一个带有自定义BaseAdapter的listView。每个列表项都有一个可点击的按钮。     private List items = new ArrayList();

public View getView(final int position, View convertView, ViewGroup parent) {

        View v = null;
        try {
            v = inflater.inflate(R.layout.row, null);

            TextView name = (TextView)v.findViewById(R.id.textView);
            name.setText(items.get(position).getName());


            imageButton = (ImageButton) v.findViewById(R.id.Button);
            imageButton.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // do something
                }
            });

        } catch (Exception e) {
            e.printStackTrace();
        }
        return v;
    }

我的问题是当我滚动列表时应用程序会冻结。 我该如何解决?

2 个答案:

答案 0 :(得分:4)

您每次都在创建一个新视图,这与列表视图的作用完全相反,它会重复使用视图。

删除View v = null并使用传入的convertView参数。

public View getView(final int position, View convertView, ViewGroup parent) {
    if(convertView == null){
        convertView = inflater.inflate(R.layout.row, null);
    }

    TextView name = (TextView)convertView.findViewById(R.id.textView);
    name.setText(items.get(position).getName());

    imageButton = (ImageButton) convertView.findViewById(R.id.Button);
    /* NB
    For efficiency sake see the link in Sparky's answer about itemClickListeners
    instead of using onClickListeners
    */
    imageButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            // do something
        }
    });

    return convertView;
}

答案 1 :(得分:3)

有关捕获ListView本身的触摸的示例,请参阅Hello, ListView tutorial,而不是每个行。