如何停止冻结listView(How to stop freeze listView)

我有一个带有自定义BaseAdapter的列表视图。每个列表项都有一个可点击的按钮。 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; }

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

i have a listView with a custom BaseAdapter.Every list item has a clickable button. 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; }

My problem is that the app freezes when i scroll the list. How can i fix it?

最满意答案

你每次创建一个新的视图,这与listview的完全相反,它重用视图。

删除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; }

You're creating a new view everytime which is the complete opposite of what a listview does, it reuses views.

Remove View v = null and use the convertView parameter passed in.

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; }

更多推荐

View,列表,items,电脑培训,计算机培训,IT培训"/> <meta name="description&quo