Android 当项目不在屏幕上时,如何修复未正确加载的自定义适配器

Android 当项目不在屏幕上时,如何修复未正确加载的自定义适配器,android,gridview,android-view,baseadapter,Android,Gridview,Android View,Baseadapter,我正在用一个自定义的ButtonAdapter构建一个视图,它加载一个StringArray,并输出一个带有按钮的GridView。 在按钮离开屏幕之前,一切都正常加载,但只有向下滚动才能看到的最后几个按钮是错误的 public class ButtonAdapter extends BaseAdapter { private Context context; private final String[] mobileValues; public ButtonAdapt

我正在用一个自定义的
ButtonAdapter
构建一个视图,它加载一个
StringArray
,并输出一个带有按钮的
GridView
。 在按钮离开屏幕之前,一切都正常加载,但只有向下滚动才能看到的最后几个按钮是错误的

public class ButtonAdapter extends BaseAdapter {
    private Context context;
    private final String[] mobileValues;

    public ButtonAdapter(Context context, String[] mobileValues) {
        this.context = context;
        this.mobileValues = mobileValues;
    }

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

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View gridView;

        if (convertView == null) {

            gridView = new View(context);

            gridView = inflater.inflate(R.layout.button, null);

            Button button = (Button) gridView
                    .findViewById(R.id.button);
            button.setText(mobileValues[position]);
            Log.d("tag1", "value: " + mobileValues[position] +" position: "+ position);

            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Button b = (Button) v.findViewById(R.id.button);
                    String mobile = b.getText().toString();
                    Log.d("tag1", "button: " + mobile);
                    if (mobile.equals("Bäm 1")){
                        play(R.raw.bam1);
                    } else if (mobile.equals("Buz")){
                        play(R.raw.buz);
                    } else if (mobile.equals("Bäm 2")){
                        play(R.raw.bam2);
                    } else if (mobile.equals("Wir nehmen das Geld")){
                        play(R.raw.gold2);
                    }
                }
            });

        } else {
            gridView = (View) convertView;
        }

        return gridView;
    }

    @Override
    public int getCount() {
        return mobileValues.length;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }
}
目前,我正在传递一个包含26项的字符串数组。在第20个按钮绘制时,
位置
下降到
0
,按钮显示错误的文本。
如何解决此问题?

代码的问题在于没有为屏幕外的视图设置测试。正确的代码应该是这样的

public class ButtonAdapter extends BaseAdapter {
    private Context context;
    private final String[] mobileValues;
    private View.OnClickListener onClListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Button b = (Button) v.findViewById(R.id.button);
            String mobile = b.getText().toString();
            Log.d("tag1", "button: " + mobile);
            if (mobile.equals("Bäm 1")){
                play(R.raw.bam1);
            } else if (mobile.equals("Buz")){
                play(R.raw.buz);
            } else if (mobile.equals("Bäm 2")){
                play(R.raw.bam2);
            } else if (mobile.equals("Wir nehmen das Geld")){
                play(R.raw.gold2);
            }
        }
    };

    public ButtonAdapter(Context context, String[] mobileValues) {
        this.context = context;
        this.mobileValues = mobileValues;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.button, parent, false);
        }
        Button button = (Button) convertView
                .findViewById(R.id.button);
        button.setText(mobileValues[position]);
        button.setOnClickListener(onClListener);

        return convertView;
    }

    @Override
    public int getCount() {
        return mobileValues != null ? mobileValues.length : 0;
    }

    @Override
    public Object getItem(int position) {
        return mobileValues[position];
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
}