Android 中可扩展的 Listview 性能下降

Ale*_*ech 5 performance android expandablelistview expandablelistadapter android-studio

我想让我的可扩展列表平滑。

在互联网上查看了很多之后,我添加了一个 viewHolder 并更改了我异步加载数据的方法。但我的清单还是很慢!!!。

你能看一下吗?我添加了使用 DataProvider 异步加载数据的活动,然后初始化我的适配器。这有助于我查看我的活动和微调器,直到加载数据然后在我的视图中更新。但是当我滚动或尝试扩展类别时,我没有流畅的列表。你能帮我告诉我要改变什么吗?我认为它可以是图像,但我将它们保存在本地以使其更快(我添加了我的方法),它可以是其他东西......

我的活动:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Set layout for this activity
        setContentView(R.layout.expandable_list);

        // Set actionbar title
        getActionBar().show();
        getActionBar().setTitle(Html.fromHtml("<font color='#fffffff'>Groups</font>"));

        if (loggedUserId != null)
            Log.d("TAG", "My Groups for user ID: " + loggedUserId);

        // Connect between buttons to layout id
        expandableListView = (ExpandableListView) findViewById(R.id.exp_list);
        spinner = (ProgressBar) findViewById(R.id.spinner);
        createCategoryButton = (ImageButton) findViewById(R.id.createCategory);
        textLoading = (TextView) findViewById(R.id.textLoading);

        // Loading data to expandable group list asynchronously
        AsyncTask<String, String, HashMap<String, List<Group>>> task = new AsyncTask<String, String, HashMap<String, List<Group>>>() {
            @Override
            protected HashMap<String, List<Group>> doInBackground(String... params) {
                return DataProvider.getInfo();
            }

            @Override
            protected void onPostExecute(HashMap<String, List<Group>> listHashMap) {
                super.onPostExecute(listHashMap);

                // Setting adapter and creating group list
                groupCategories = listHashMap;
                groupsList = new ArrayList<String>(groupCategories.keySet());
                adapter = new Adapter(GroupsListActivity.this, groupCategories, groupsList, GroupsListActivity.this);
                expandableListView.setAdapter(adapter);

                // Hide spinner after loading
                spinner.setVisibility(View.GONE);
                textLoading.setVisibility(View.GONE);
            }
        };
        task.execute();
Run Code Online (Sandbox Code Playgroud)

我的适配器:

@Override
    public View getGroupView(final int parent, boolean isExpanded, View convertView, ViewGroup parentView) {
        final String categoryName = (String) getGroup(parent);

        ParentViewHolder pHolder = null;

        if (convertView == null) {
            // Creates a ViewHolder and store references to layouts we want to bind data to.
            pHolder = new ParentViewHolder();
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.expandable_list_parent, parentView, false);

            // Connect between buttons to layout id
            pHolder.categoryNameTextView = (TextView) convertView.findViewById(R.id.categoryName);
            pHolder.editCategory = (ImageButton) convertView.findViewById(R.id.editCategory);
            pHolder.deleteCategory = (ImageButton) convertView.findViewById(R.id.deleteCategory);

            //Save holder
            convertView.setTag(pHolder);
        } else {
            // Get the ViewHolder back
            pHolder = (ParentViewHolder) convertView.getTag();
        }

        // Hide edit and delete button for category name Others
        if (categoriesList.get(parent).equals("Others")) {
            pHolder.editCategory.setVisibility(View.GONE);
            pHolder.deleteCategory.setVisibility(View.GONE);
        } else {
            pHolder.editCategory.setVisibility(View.VISIBLE);
            pHolder.deleteCategory.setVisibility(View.VISIBLE);
        }

        // Set category name on row
        pHolder.categoryNameTextView.setTypeface(null, Typeface.BOLD);
        pHolder.categoryNameTextView.setText(categoryName + ": " + getChildrenCount(parent));

        // Set edit category button listener
        final ParentViewHolder finalPHolder = pHolder;
        pHolder.editCategory.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finalPHolder.editCategory.setEnabled(false);
                editCategoryName(activity, finalPHolder.categoryNameTextView.getText().toString().toString().split(": ")[0], finalPHolder.editCategory, parent);
            }
        });

        // Set delete category button listener
        pHolder.deleteCategory.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finalPHolder.deleteCategory.setEnabled(false);
                deleteCategory(activity, categoryName, finalPHolder.deleteCategory);
            }
        });

        return convertView;
    }

    @Override
    public View getChildView(final int parent, final int child, boolean lastChild, View convertView, ViewGroup parentView) {
        final Group group = (Group) getChild(parent, child);

        ChildViewHolder cHolder = null;

        if (convertView == null) {
            // Creates a ViewHolder and store references to layouts we want to bind data to.
            cHolder = new ChildViewHolder();
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.expandable_list_child, parentView, false);

            // Connect between buttons to layout id
            cHolder.groupImage = (ImageView) convertView.findViewById(R.id.groupImage);
            cHolder.groupName = (TextView) convertView.findViewById(R.id.groupName);
            cHolder.moveCategory = (ImageButton) convertView.findViewById(R.id.moveCategory);
            cHolder.groupFavoritesButton = (ImageButton) convertView.findViewById(R.id.groupFavorites);
            cHolder.groupLeaveGroupButton = (Button) convertView.findViewById(R.id.groupLeave);
            cHolder.groupImageProgressbar = (ProgressBar) convertView.findViewById(R.id.groupImageProgressBar);

            //Save holder
            convertView.setTag(cHolder);
        } else {
            // Get the ViewHolder back
            cHolder = (ChildViewHolder) convertView.getTag();
        }

        // Set group name on row
        cHolder.groupName.setText(group.getName());

        // Load group image
        cHolder.groupImageProgressbar.setVisibility(View.VISIBLE);
        final ChildViewHolder finalHolder = cHolder;

        Model.getInstance().getGroupImage(group.getImageName(), new Model.LoadImageListener() {
            @Override
            public void onResult(Bitmap imageBmp) {
                if (imageBmp != null) {
                    finalHolder.groupImage.setImageBitmap(imageBmp);
                    finalHolder.groupImageProgressbar.setVisibility(View.GONE);
                    finalHolder.groupImage.setVisibility(View.VISIBLE);
                }
            }
        });

        // Set move category button listener
        cHolder.moveCategory.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finalHolder.moveCategory.setEnabled(false);
                showDialogMoveCategory(activity, group.getGroupID(), finalHolder.moveCategory);
            }
        });


        // After click on group image - open profile for this group
        cHolder.groupImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onGroupSelected(group.getGroupID());
            }
        });

        // Setting favorite Button Image
        boolean isFavorite = Model.getInstance().groupIsFavorite(loggedUserId, group.getGroupID());

        if (isFavorite)
            cHolder.groupFavoritesButton.setBackgroundResource(R.mipmap.favorites_on);
        else
            cHolder.groupFavoritesButton.setBackgroundResource(R.mipmap.favorites_off);

        // Setting favorite Button Action
        cHolder.groupFavoritesButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Add group to favorites
                if (!Model.getInstance().groupIsFavorite(loggedUserId, group.getGroupID())) {
                    finalHolder.groupFavoritesButton.setBackgroundResource(R.mipmap.favorites_on);
                    Toast.makeText(activity,
                            "The group " + group.getName() + " was added to favorites", Toast.LENGTH_SHORT).show();
                    Model.getInstance().changeFavoriteStatus(loggedUserId, group.getGroupID(), "true");

                } else {
                    // Delete group from favorites
                    finalHolder.groupFavoritesButton.setBackgroundResource(R.mipmap.favorites_off);
                    Toast.makeText(activity,
                            "The group " + group.getName() + " was removed from favorites", Toast.LENGTH_SHORT).show();
                    Model.getInstance().changeFavoriteStatus(loggedUserId, group.getGroupID(), "false");
                }
            }
        });

        // After click on group action - leave group
        cHolder.groupLeaveGroupButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finalHolder.groupLeaveGroupButton.setEnabled(false);
                showDialogLeaveGroup(activity, "Are you sure ?", "This action will remove yourself from the group " + group.getName(), group.getGroupID(), parent, child);
                finalHolder.groupLeaveGroupButton.setEnabled(true);
            }
        });

        return convertView;
    }
Run Code Online (Sandbox Code Playgroud)

图片方法:

public void getGroupImage(final String imageName, final LoadImageListener listener) {
        AsyncTask<String, String, Bitmap> task = new AsyncTask<String, String, Bitmap>() {
            @Override
            protected Bitmap doInBackground(String... params) {
                Bitmap bmp = loadImageFromFile(imageName);              //first try to find the image on the device
                //  Bitmap bmp = null;
                if (bmp == null) {                                      //if image not found - try downloading it from parse
                    bmp = modelParse.getGroupImage(imageName);
                    if (bmp != null)
                        saveImageToFile(bmp, imageName);    //save the image locally for next time *****
                }
                Bitmap scaledBitmap = scaleDown(bmp, 200, true);
                return scaledBitmap;
            }

            @Override
            protected void onPostExecute(Bitmap result) {
                listener.onResult(result);
            }
        };
        task.execute();
    }

 private void saveImageToFile(Bitmap imageBitmap, String imageFileName) {
        FileOutputStream fos;
        OutputStream out = null;
        try {
            File dir = context.getExternalFilesDir(null);
            out = new FileOutputStream(new File(dir, imageFileName + ".jpg"));
            imageBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
            out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private Bitmap loadImageFromFile(String fileName) {
        Bitmap bitmap = null;
        try {
            File dir = context.getExternalFilesDir(null);
            InputStream inputStream = new FileInputStream(new File(dir, fileName + ".jpg"));
            bitmap = BitmapFactory.decodeStream(inputStream);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return bitmap;
    }
Run Code Online (Sandbox Code Playgroud)