ListView非常落后-Android
我已经创建了一个自定义列表视图。我曾尝试优化ListView适配器的getView方法,但仍然存在滞后现象 我在适配器中做错了什么导致ListView延迟 或者,如果它看起来不错,是什么导致了延迟 ListView中一行的xml为:ListView非常落后-Android,android,listview,optimization,adapter,Android,Listview,Optimization,Adapter,我已经创建了一个自定义列表视图。我曾尝试优化ListView适配器的getView方法,但仍然存在滞后现象 我在适配器中做错了什么导致ListView延迟 或者,如果它看起来不错,是什么导致了延迟 ListView中一行的xml为: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layo
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="6dip"
android:background="@color/all_white"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="6dip"
android:background="@color/all_white"
android:gravity="center">
<TextView
android:layout_width="40dip"
android:layout_height="wrap_content"
android:paddingTop="10dip"
android:paddingBottom="10dip"
/>
<Button
android:layout_width="197dip"
android:layout_height="wrap_content"
android:layout_marginRight="8dip"
android:paddingTop="10dip"
android:paddingBottom="10dip"
android:background="@drawable/button_300"
android:textColor="@color/all_white"
/>
<Button
android:layout_width="197dip"
android:layout_height="wrap_content"
android:layout_marginRight="8dip"
android:paddingTop="10dip"
android:paddingBottom="10dip"
android:background="@drawable/button_300"
android:textColor="@color/all_white"
/>
<Button
android:layout_width="197dip"
android:layout_height="wrap_content"
android:layout_marginRight="8dip"
android:paddingTop="10dip"
android:paddingBottom="10dip"
android:background="@drawable/button_300"
android:textColor="@color/all_white"
/>
<Button
android:layout_width="197dip"
android:layout_height="wrap_content"
android:layout_marginRight="8dip"
android:paddingTop="10dip"
android:paddingBottom="10dip"
android:background="@drawable/button_300"
android:textColor="@color/all_white"
/>
<Button
android:layout_width="197dip"
android:layout_height="wrap_content"
android:layout_marginRight="8dip"
android:paddingTop="10dip"
android:paddingBottom="10dip"
android:background="@drawable/button_300"
android:textColor="@color/all_white"
/>
<Button
android:layout_width="197dip"
android:layout_height="wrap_content"
android:layout_marginRight="8dip"
android:paddingTop="10dip"
android:paddingBottom="10dip"
android:background="@drawable/button_300"
android:textColor="@color/all_white"
/>
</LinearLayout>
</LinearLayout>
我的适配器的代码是:
公共类MultiWorkspaceAdapter2扩展了BaseAdapter{
/*
* A map of the workspaces of a user, with key == first letter of the workspace title
* and value == the list of WorkspaceInfos for that key.
*/
private LinkedHashMap<String, List<WorkspaceInfo>> _workspacesMap;
/*
* Array of keys in order to get the values in getItem.
*/
private String[] _keys;
private Activity _activity;
public MultiWorkspaceAdapter2(Activity activity, LinkedHashMap<String, List<WorkspaceInfo>> map) {
_workspacesMap = map;
_keys = (String[]) _workspacesMap.keySet().toArray(new String[_workspacesMap.size()]);
_activity = activity;
}
public int getCount() {
return _workspacesMap.size();
}
public Object getItem(int position) {
_keys = (String[]) _workspacesMap.keySet().toArray(new String[_workspacesMap.size()]);
List<WorkspaceInfo> list = new ArrayList<WorkspaceInfo>();
try {
if (_keys[position] != null) {
list = _workspacesMap.get(_keys[position]);
}
} catch (ArrayIndexOutOfBoundsException e) {
list = null;
}
return list;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewGroup viewGroup = null;
int numRows = 0;
if (convertView != null) {
viewGroup = (ViewGroup) convertView;
} else {
LayoutInflater inflater = (LayoutInflater) _activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
viewGroup = (ViewGroup) inflater.inflate(R.layout.multi_workspace_layout, parent, false);
_keys = (String[]) _workspacesMap.keySet().toArray(new String[_workspacesMap.size()]);
List<WorkspaceInfo> workspaces = new ArrayList<WorkspaceInfo>();
try {
if (_keys[position] != null) {
workspaces = _workspacesMap.get(_keys[position]);
//Collections.sort(workspaces, new InfoNameComparator());
}
} catch (ArrayIndexOutOfBoundsException e) {
//
}
numRows = viewGroup.getChildCount();
//Find how many buttons are in a row.
int buttonsInRow = ((ViewGroup) viewGroup.getChildAt(0)).getChildCount();
int totalRows = 0;
int size = workspaces.size();
if (size > 0) {
totalRows = size / buttonsInRow + 1;
}
if (numRows < totalRows) {
for (int i = numRows; i < totalRows; i++) {
View view;
LayoutInflater inflater2 = (LayoutInflater) _activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = (View) inflater2.inflate(R.layout.list_row_multi_ws, viewGroup, false);
viewGroup.addView(view, i);
}
} else if (numRows > totalRows) {
for (int i = numRows; i > totalRows; i--) {
viewGroup.removeViewAt(totalRows);
}
}
//Iterate over workspaces
Iterator<WorkspaceInfo> iterator = workspaces.iterator();
for (int i = 0; i < viewGroup.getChildCount(); i++) {
//Linear layout child containing buttons and textview.
ViewGroup temp = (ViewGroup) viewGroup.getChildAt(i);
for (int j = 0; j < temp.getChildCount(); j++) {
if (j == 0) {
//The letter these workspaces start with
TextView textview = (TextView) temp.getChildAt(j);
String letter = _keys[position];
textview.setText(_keys[position]);
if (i != 0 && temp.getId() != R.id.workspaces_portrait) {
textview.setVisibility(View.INVISIBLE);
} else if (i != 0) {
textview.setVisibility(View.GONE);
}
} else {
//A workspace button
Button button = (Button) temp.getChildAt(j);
if (iterator.hasNext()) {
//Get the next workspace
final WorkspaceInfo workspace = iterator.next();
//Get the title of the workspace and set as text.
String buttonText = workspace.getTitle();
button.setText(buttonText);
button.setVisibility(View.VISIBLE);
//Add OnClickListener
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//If the workspace is pending, handle the invitation.
if (workspace.getStatus() == StaticFields.PENDING_WORKSPACE) {
((SkootWorkspacesActivity) _activity).handleInvitation(workspace);
} else {
//open the workspace
((SkootWorkspacesActivity) _activity).openWorkspace(workspace);
}
}
});
button.setOnLongClickListener(new OnLongClickListener() {
public boolean onLongClick(View v) {
((SkootWorkspacesActivity) _activity).makeDeleteDialog(workspace);
return true;
}
});
} else {
button.setVisibility(View.GONE);
}
}
}
}
}
return viewGroup;
}
/*
*用户工作区的映射,键==工作区标题的第一个字母
*和value==该键的工作空间信息列表。
*/
私有LinkedHashMap\u工作空间映射;
/*
*用于获取getItem中的值的键数组。
*/
私有字符串[]_密钥;
私人活动;
公共多工作空间适配器2(活动活动、LinkedHashMap映射){
_workspacesMap=map;
_keys=(字符串[])_workspacesMap.keySet().toArray(新字符串[_workspacesMap.size()]);
_活动=活动;
}
public int getCount(){
返回_workspacesMap.size();
}
公共对象getItem(int位置){
_keys=(字符串[])_workspacesMap.keySet().toArray(新字符串[_workspacesMap.size()]);
列表=新的ArrayList();
试一试{
如果(_keys[position]!=null){
列表=_workspacesMap.get(_keys[position]);
}
}捕获(阵列索引边界外异常e){
列表=空;
}
退货清单;
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewGroup ViewGroup=null;
int numRows=0;
if(convertView!=null){
视图组=(视图组)转换视图;
}否则{
LayoutInflater充气器=(LayoutInflater)\u activity.getSystemService(Context.LAYOUT\u充气器\u SERVICE);
视图组=(视图组)充气器。充气(R.layout.multi_workspace_layout,parent,false);
_keys=(字符串[])_workspacesMap.keySet().toArray(新字符串[_workspacesMap.size()]);
列表工作空间=新建ArrayList();
试一试{
如果(_keys[position]!=null){
工作空间=_workspacesMap.get(_keys[position]);
//排序(工作空间,新InfoNameComparator());
}
}捕获(阵列索引边界外异常e){
//
}
numRows=viewGroup.getChildCount();
//查找一行中有多少个按钮。
int buttonsInRow=((视图组)ViewGroup.getChildAt(0)).getChildCount();
int totalRows=0;
int size=workspaces.size();
如果(大小>0){
totalRows=大小/按钮箭头+1;
}
如果(numRowstotalRows){
对于(int i=numRows;i>totalRows;i--){
viewGroup.removeViewAt(totalRows);
}
}
//迭代工作空间
迭代器迭代器=工作空间。迭代器();
对于(int i=0;i
我将此适配器添加到MergeAdapter并进行设置
ViewHolder holder=new ViewHolder();
public View getView(int position, View convertView, ViewGroup parent) {
AppInfo entry = mListAppInfo.get(position);
ViewHolder holder = null;
if(convertView == null) {
LayoutInflater inflater = LayoutInflater.from(mContext);
convertView = inflater.inflate(R.layout.layout_appinfo, null);
holder = new ViewHolder();
holder.ivIcon = (ImageView)convertView.findViewById(R.id.ivIcon);
holder.tvName = (TextView)convertView.findViewById(R.id.tvName);
convertView.setTag(holder);
}
else {
holder = (ViewHolder)convertView.getTag();
}
holder.ivIcon.setImageBitmap(entry.getIcon());
holder.tvName.setText(entry.getName());
return convertView;
}
static class ViewHolder {
ImageView ivIcon;
TextView tvName;
}