滚动时网格视图视图持有者设置了错误的图像

Grid view view holder set wrong image when scrolling

问题:滚动后 GridView 单元格中的 ImageView 发生了变化。

没有 ViewHolder 也能正常工作。
这里食物图标变为最后一项,这是默认的。

// 网格视图适配器

    public class FlagTypAdapter extends BaseAdapter {
    Context ctx;
    ArrayList<Accounts> list;
    FlagTypAdapter adapter;
    Boolean isAtm;
    Activity mActivity;
    static Integer[] imageId = {
            R.drawable.electricity_bill,
            R.drawable.food_icon_large,
            R.drawable.loan_large,
            R.drawable.movies_large,
            R.drawable.other_large,
            R.drawable.petrol_icon_large,
            R.drawable.phone_bill_large,
            R.drawable.rent_large,
            R.drawable.shopping_large,
            R.drawable.travel_large,
            R.drawable.water_bill_large,
            R.drawable.salary_large,
            R.drawable.cash_large,
            R.drawable.creditcard_large,
            R.drawable.cash_withdraw_large,
            R.drawable.newspaper_large

    };
//constructor for getting list 

    public FlagTypAdapter(ArrayList<Accounts> paramArrayList, Context paramContext, Activity activity, Boolean Atm) {
        this.list = paramArrayList;
        this.ctx = paramContext;
        this.mActivity = activity;
        this.isAtm = Atm;
    }

    public int getCount() {

        return this.list.size();
    }

    public Object getItem(int paramInt) {
        return this.list.get(paramInt);
    }

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

    public View getView(int paramInt, View paramView, ViewGroup paramViewGroup) {
        ViewHolder viewholder;
        Accounts dto = list.get(paramInt);
        if (paramView == null) {
            paramView = LayoutInflater.from(ctx).inflate(R.layout.grid_cell, null);
            viewholder = new ViewHolder();
            viewholder.tvName = ((TextView) paramView.findViewById(R.id.grid_text));
            viewholder.imageTag = ((ImageView) paramView.findViewById(R.id.grid_image));
            viewholder.imageTag.setImageResource(0);
            paramView.setTag(viewholder);

            Log.e("creating new row" + dto.getAccountName(), "creating row");

        } else {
            Log.e("not creating new row" + dto.getAccountName(), " not creating row");
            viewholder = (ViewHolder) paramView.getTag();
        }


        viewholder.tvName.setText(dto.getAccountName());

        if (dto.getAccountName() != null) {

            switch (dto.getAccountName()) {


                case "Food":
                    Log.e("account name in food ", "" + dto.getAccountName().toString());
                    viewholder.imageTag.setBackgroundResource(imageId[1]);
                    break;
                case "Petrol":
                    viewholder.imageTag.setBackgroundResource(imageId[5]);
                    break;
                case "Phone bill":
                    viewholder.imageTag.setBackgroundResource(imageId[6]);
                    break;
                case "Electricity bill":
                    viewholder.imageTag.setBackgroundResource(imageId[0]);
                    break;
                case "Rent":
                    viewholder.imageTag.setBackgroundResource(imageId[7]);
                    break;
                case "Other":
                    viewholder.imageTag.setBackgroundResource(imageId[4]);
                    break;
                case "Shopping":
                    viewholder.imageTag.setBackgroundResource(imageId[8]);
                    break;
                case "Salary":
                    viewholder.imageTag.setBackgroundResource(imageId[11]);
                    break;
                case "Loan":
                    viewholder.imageTag.setBackgroundResource(imageId[2]);
                    break;
                case "Travelling":
                    viewholder.imageTag.setBackgroundResource(imageId[9]);
                    break;
                case "Cash":
                    viewholder.imageTag.setBackgroundResource(imageId[12]);
                    break;
                case "Credit card":
                    viewholder.imageTag.setBackgroundResource(imageId[13]);
                    break;
                case "Water bill":
                    viewholder.imageTag.setBackgroundResource(imageId[10]);
                    break;
                case "Movies":
                    viewholder.imageTag.setBackgroundResource(imageId[3]);
                    break;
                case "ATM withdraw":
                    viewholder.imageTag.setBackgroundResource(imageId[14]);
                    break;
                case "Books/News paper":
                    viewholder.imageTag.setBackgroundResource(imageId[15]);
                    break;
                default:
                    Log.e("account name in default", "" + dto.getAccountName().toString());
                    viewholder.imageTag.setImageBitmap(CommonUtility.drawImageGrid(dto.getAccountName(), mActivity));
                    break;

            }
        }


        return paramView;
    }


    private static class ViewHolder {

        TextView tvName;
        ImageView imageTag;
    }
}

试试这个:

public View getView(int paramInt, View paramView, ViewGroup paramViewGroup) {
        ViewHolder viewholder;
        Accounts dto = list.get(paramInt);
        if (paramView == null) {
            paramView = LayoutInflater.from(ctx).inflate(R.layout.grid_cell, null);
            viewholder = new ViewHolder();
            viewholder.tvName = ((TextView) paramView.findViewById(R.id.grid_text));
            viewholder.imageTag = ((ImageView) paramView.findViewById(R.id.grid_image));

            paramView.setTag(viewholder);

            Log.e("creating new row" + dto.getAccountName(), "creating row");

        } else {
            Log.e("not creating new row" + dto.getAccountName(), " not creating row");
            viewholder = (ViewHolder) paramView.getTag();
        }

         viewholder.imageTag.setImageResource(0);


        viewholder.tvName.setText(dto.getAccountName());

        if (dto.getAccountName() != null) {

            switch (dto.getAccountName()) {


                case "Food":
                    Log.e("account name in food ", "" + dto.getAccountName().toString());
                    viewholder.imageTag.setBackgroundResource(imageId[1]);
                    break;
                case "Petrol":
                    viewholder.imageTag.setBackgroundResource(imageId[5]);
                    break;
                case "Phone bill":
                    viewholder.imageTag.setBackgroundResource(imageId[6]);
                    break;
                case "Electricity bill":
                    viewholder.imageTag.setBackgroundResource(imageId[0]);
                    break;
                case "Rent":
                    viewholder.imageTag.setBackgroundResource(imageId[7]);
                    break;
                case "Other":
                    viewholder.imageTag.setBackgroundResource(imageId[4]);
                    break;
                case "Shopping":
                    viewholder.imageTag.setBackgroundResource(imageId[8]);
                    break;
                case "Salary":
                    viewholder.imageTag.setBackgroundResource(imageId[11]);
                    break;
                case "Loan":
                    viewholder.imageTag.setBackgroundResource(imageId[2]);
                    break;
                case "Travelling":
                    viewholder.imageTag.setBackgroundResource(imageId[9]);
                    break;
                case "Cash":
                    viewholder.imageTag.setBackgroundResource(imageId[12]);
                    break;
                case "Credit card":
                    viewholder.imageTag.setBackgroundResource(imageId[13]);
                    break;
                case "Water bill":
                    viewholder.imageTag.setBackgroundResource(imageId[10]);
                    break;
                case "Movies":
                    viewholder.imageTag.setBackgroundResource(imageId[3]);
                    break;
                case "ATM withdraw":
                    viewholder.imageTag.setBackgroundResource(imageId[14]);
                    break;
                case "Books/News paper":
                    viewholder.imageTag.setBackgroundResource(imageId[15]);
                    break;
                default:
                    Log.e("account name in default", "" + dto.getAccountName().toString());
                    viewholder.imageTag.setImageBitmap(CommonUtility.drawImageGrid(dto.getAccountName(), mActivity));
                    break;

            }
        }


        return paramView;
    }

一切顺利,我只是更改了将图像设置为 imageTag.setimageResource() 而不是 imageTag.setBackgroundResource();

的方法