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