I have a GridView
in my application in which I want to show text and check boxes just like emails inbox page. I use an adapter for that but when I show more than 15 elements the text and check boxes of top rows disappear so when I scroll upside again they aren't visible. Here is my code
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;
}
}
Call to adapter class is as:
table.setAdapter(new EmployeeAdaptor(this, empTable, numberofboxes, 0, selected));
//OR
table.setAdapter(new EmployeeAdaptor(this, empTable, numberofboxes, 1, selected));
Layout XML file is
<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>
The problem seems to be that you aren't recycling views properly. The following minimal example is based on a simplification of your code (I've got rid off some members and some conditional blocks). Only two kinds of cells, TextView
and CheckBox
are considered.
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;
}
}
Note the use of getViewTypeCount
and getItemViewType
. They help you when your getView
deals with different types of views.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With