6

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>
4

2 に答える 2

1

問題は、ビューを適切にリサイクルしていないことです。次の最小限の例は、コードの単純化に基づいています (いくつかのメンバーといくつかの条件付きブロックを取り除きました)。2 種類のセルのみ、TextViewCheckBox見なされます。

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との使用に注意してくださいgetItemViewTypegetViewさまざまなタイプのビューを扱うときに役立ちます。

于 2012-08-26T22:34:52.753 に答える
-1

新しいアイテムを追加すると、GridView がいっぱいになり、自動的に下にスクロールすると思います (したがって、最初のアイテムは上部に「残ります」)。15 アイテム以上のスペースはありますか? 特に、GridView の高さを 360 dp に固定してからですか? デバッグ用に GridView に背景色を設定して、GridView が取得するスペースの量と、最初の 15 項目が占める量を確認できます。

于 2012-08-26T12:56:35.860 に答える