我的应用程序中有GridView
,我想在其中显示文本和复选框,就像电子邮件收件箱页面一样。我使用了一个适配器,但当我显示超过15个元素时,顶行的文本和复选框消失,所以当我再次向上滚动它们时,它们是不可见的。这是我的代码
public class EmployeeAdaptor extends BaseAdapter {
Context context;
String [] table;
int pos;
int formatOfTable;
public EmployeeAdaptor(Context c,String []tab,int numberOfItems,int format, boolean[] sel) {
context = c;
table = tab;
items = numberOfItems;
formatOfTable = format;
//ifformat is 0 then show text view in first column
//if it is 1 then show radio button in first column
//if it is 2 then show check box in first column.
pos = 0;
}
public int getCount() {
//
return items;
}
public Object getItem(int position) {
//
return position;
}
public long getItemId(int position) {
//
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
View v;
TextView text = new TextView(context);
RadioButton radio = new RadioButton(context);
CheckBox check = new CheckBox(context);
if(convertView == null){
v = new View(context);
}
else{
v = convertView;
}
if(formatOfTable==2 && position%5==0 && position/5!=0){
check.setId(position/5);
v = check;
}
else if(formatOfTable==0 && position%5==0 && position/5!=0){
text.setText("");
v = text;
//To set blank text at first position when no need of check
}
else{
if(position%5!=0){
try{
v = text;
text.setText(table[pos]);
text.setTextColor(Color.BLACK);
text.setTextSize(20);
pos++;
}
catch(Exception e){
}
}
}
if(position/5==0){
text.setTypeface(Typeface.DEFAULT_BOLD);
}
return v;
}
}
调用适配器类为:
table.setAdapter(new EmployeeAdaptor(this, empTable, numberofboxes, 0, selected));
//OR
table.setAdapter(new EmployeeAdaptor(this, empTable, numberofboxes, 1, selected));
布局XML文件
<GridView
android:id="@+id/gridView1"
android:layout_width="wrap_content"
android:layout_height="360dp"
android:layout_marginTop="40dp"
android:numColumns="5" android:verticalSpacing="35dp">
</GridView>
答案 0 :(得分:1)
问题似乎是您没有正确回收视图。以下最小的示例基于代码的简化(我已经删除了一些成员和一些条件块)。只考虑两种单元格TextView
和CheckBox
。
public class EmployeeAdaptor extends BaseAdapter {
private Context context;
public String [] table;
private int items;
public EmployeeAdaptor(Context c,String []tab,int numberOfItems) {
context = c;
items = numberOfItems;
}
@Override
public int getCount() {return items;}
@Override
public Object getItem(int position) {return position;}
@Override
public long getItemId(int position) {return position;}
@Override
public int getItemViewType(int position) {
int viewType;
if (position%5 == 0 && position/5 != 0) {
// Positions 5, 10, 15...
// Return a CheckBox
viewType = 0;
} else {
// Return a TextView
viewType = 1;
}
return viewType;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v;
if (convertView == null) {
if (position%5 == 0 && position/5 != 0) {
// Positions 5, 10, 15...
// Return a CheckBox
v = new CheckBox(context);
} else {
// Return a TextView
v = new TextView(context);
}
} else {
v = convertView;
}
if (position < 5) {
((TextView)v).setTypeface(Typeface.DEFAULT_BOLD);
((TextView)v).setText(table[position]);
} else if (position%5 == 0 && position/5 != 0) {
// Positions 5, 10, 15...
((CheckBox)v).setId(position/5);
} else {
((TextView)v).setTypeface(Typeface.DEFAULT);
((TextView)v).setText(table[position]);
}
return v;
}
}
请注意getViewTypeCount
和getItemViewType
的使用。当getView
处理不同类型的观看时,他们会为您提供帮助。
答案 1 :(得分:-1)
我认为GridView只是已满并且在您添加新项目时会自动向下滚动(因此顶部的第一项“离开”)。是否有超过15件物品的空间?特别是因为你将GridView的高度固定为360dp?您可以为GridView设置背景颜色以进行调试,以查看GridView获取的空间大小以及前15个项目占用的空间。