0

カスタム リスト フィールドを作成していますが、invalidate メソッドを呼び出すと機能しません。画面は常に空ですが、リスト フィールドのデータは null または空ではありません。問題を解決するのを手伝ってください。
前もって感謝します

public class FileListField extends ListField implements ListFieldCallback{

    private static final Bitmap fileBitmap = Bitmap.getBitmapResource("document.png");
    private static final Bitmap dirBitmap = Bitmap.getBitmapResource("emty_folder.png");
    private static final Bitmap addBitmap = Bitmap.getBitmapResource("svn_added.png");
    private static final Bitmap delBitmap = Bitmap.getBitmapResource("svn_deleted.png");
    private static final Bitmap modBitmap = Bitmap.getBitmapResource("svn_modified.png");
    private static final Bitmap novBitmap = Bitmap.getBitmapResource("svn_noversion.png");
    private static final Bitmap norBitmap = Bitmap.getBitmapResource("svn_normal.png");
    //static Bitmap dowBitmap = Bitmap.getBitmapResource("svn_added.png");

    private BigVector bv;

    public FileListField(){
        super();
        bv = new BigVector();
        setCallback(this);
    }

    public void setFileModelVector(BigVector fileModelVector){
        bv.removeAll();
        bv.addElements(fileModelVector.getContiguousArray());
        invalidate();
        System.out.println("ISSSSSSSSSSSSSS CALLLLLLLLLLINNNNNNNG?");
        System.out.println("DISSSPATH?"+UiApplication.isEventDispatchThread());
//      invalidateRange(0, bv.size()-1);
//      FileModel[] fileModelArr = new FileModel[fileModelVector.size()];
//      for(int i=0;i<fileModelVector.size();i++)
//          fileModelArr[i] = (FileModel)fileModelVector.elementAt(i);
//      set(fileModelArr);
    }

    public BigVector getFileModelVector(){
//      BigVector bv = new BigVector();
//      for(int i=0;i<this.getSize();i++)
//          bv.addElement(get(this, i));
        return bv;
    }

    public void set(Object[] or){

    }

    public Object get(ListField list, int index){
        return bv.elementAt(index);
    }

    public int getSize(){
        return bv.size();
    }

    public int indexOfList(ListField listField, String prefix, int start) {
        return getSelectedIndex();
    }

    public int getPreferredWidth(ListField listField) {
        return Display.getWidth();
    }

    public void drawListRow(ListField listField, Graphics graphics
            , int index, int y, int width){
        System.out.println("DRWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
        FileModel fileModel = (FileModel)get(listField, index);
        if(fileModel.isFile())
            graphics.drawBitmap(0, y, width, fileBitmap.getHeight()
                    , fileBitmap, 0, 0);
        else
            graphics.drawBitmap(0, y, width, dirBitmap.getHeight()
                    , dirBitmap, 0, 0);
        switch(fileModel.getStatus()){
            case FileModel.ADD_STATUS:
                graphics.drawBitmap(0, y, width, addBitmap.getHeight()
                        , addBitmap, 0, 0);
                break;
            case FileModel.DEL_STATUS:
                graphics.drawBitmap(0, y, width,delBitmap.getHeight()
                        , delBitmap, 0, 0);
                break;
            case FileModel.MOD_STATUS:
                graphics.drawBitmap(0, y, width, modBitmap.getHeight()
                        , modBitmap, 0, 0);
                break;
            case FileModel.DOW_STATUS:
                break;
            case FileModel.NOR_STATUS:
                graphics.drawBitmap(0, y, width, norBitmap.getHeight()
                        , norBitmap, 0, 0);
                break;
            default:
                graphics.drawBitmap(0, y, width, novBitmap.getHeight()
                        , novBitmap, 0, 0);
                break;
        }
        graphics.drawText(fileModel.getName(), fileBitmap.getWidth(), y);
    }

}
4

1 に答える 1

0

invalidate()あなたに電話するListFieldだけでは十分ではないと思います。invalidate()呼び出しは実際にはビューレイヤーメソッドであり、フィールドを再描画する必要があることを示します。あなたが実際に行っていることは、モデルが変更されたことを示しています。

スタック オーバーフローに関するこの他の質問を参照してください

setSize() を使用して、コードを次のように変更してみてください。

public void setFileModelVector(BigVector fileModelVector){
    bv.removeAll();
    bv.addElements(fileModelVector.getContiguousArray());
    //invalidate();
    setSize(bv.size());
}

また、ベクター自体の所有権をどのように正確に処理しているかはわかりませんが、おそらくこれを行うこともできます。

public void setFileModelVector(BigVector fileModelVector){
    bv = fileModelVector;
    //invalidate();
    setSize(bv.size());
}

ベクトル全体をクリアしてから、新しいベクトルを配列に変換してから、配列を元のベクトルに追加しているためです。しかし、それは別の問題であり、空の が表示される理由ではありませんListField

于 2013-01-06T23:27:47.177 に答える