1

カスタムアダプターのチェックボックスを機能させようとしています。ただし、まだ取得していない小さな部分があるため、テストしようとするタイプごとにプログラムが強制的に閉じられ続けます。

これは、SD カード内のすべての画像ファイルを一覧表示するファイル マネージャーです。

public class FileBrowserMusic extends ListActivity {

    private File currentDir;
    private FileArrayAdapter adapter;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.music_main);

        currentDir = new File (Environment.getExternalStorageDirectory().getPath());
        List<Option>flss = new ArrayList<Option>();
        listFiles (currentDir, flss);
        Collections.sort (flss);
        ArrayAdapter<Option> adapter = new FileArrayAdapter(this, flss);
            setListAdapter(adapter);
        registerForContextMenu(getListView());
    }

    // Recursively search for all image files.
    private void listFiles (File f, List<Option> flss) {
        if(f.isDirectory()){
            File[] files = f.listFiles();

            try {
                for (File ff : files){
                    if(!ff.isDirectory()) {
                        if(ff.getName().endsWith(".jpg")) {
                            Log.d(" FILES",ff.getName());
                            flss.add(new Option (ff.getName(),"Files Size: "+ff.length(),ff.getAbsolutePath()));
                        }
                    }
                    else {
                        listFiles(ff, flss);
                    }
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                //e.printStackTrace();
            } 
        }
    }

}

これは私のアダプタークラスです。

public class FileArrayAdapter extends ArrayAdapter<Option> {

    private Context c;
    private int id;
    private List<Option>items;
    private Activity context;

    public FileArrayAdapter(Activity context, List<Option> objects) {
        super(context, R.layout.music_view, objects);

        this.context = context;
        items = objects;
    }

    public Option getItem (int i) {
        return items.get (i);
    }

    static class ViewHolder {
        protected TextView name, size;
        protected CheckBox checkbox;
    }

    @Override
public View getView (int position, View convertView, ViewGroup parent) {
    // View v = convertView;
    final Option o = items.get(position);
    /*if (v == null) {
        LayoutInflater vi = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.music_view, null);*/
    View v = null;
    final ViewHolder viewHolder = new ViewHolder();
    if (convertView == null) {
        LayoutInflater inflator = context.getLayoutInflater();
        v = inflator.inflate(R.layout.music_view, null);

        //TextView t1 = (TextView) v.findViewById(R.id.backDot);
        //TextView t2 = (TextView) v.findViewById(R.id.backPDir);
        viewHolder.name = (TextView) v.findViewById(R.id.name);
        viewHolder.size = (TextView) v.findViewById(R.id.size);
        viewHolder.checkbox = (CheckBox) v.findViewById(R.id.check);
        viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub
                Option element = (Option) viewHolder.checkbox.getTag();
                element.setSelected(buttonView.isChecked());
                Log.v("Checked : ", ""+ element.getName());
            }

        });

        v.setTag(viewHolder);
        viewHolder.checkbox.setTag(items.get(position));

    } else {
        v = convertView;
        ((ViewHolder) v.getTag()).checkbox.setTag(items.get(position));
    }

    ViewHolder holder = (ViewHolder) v.getTag();
    holder.name.setText(o.getName());
    holder.size.setText(o.getPath());
    holder.checkbox.setChecked(o.isSelected());

    return v;
}

}

私のオプションクラス。

public class Option implements Comparable<Option>{

    private String name;
    private String data;
    private String path;
    boolean selected = false;

    public Option (String n, String d, String p) {
        name = n;
        data = d;
        path = p;       
    }

    public Option (String n, String d, String p, boolean s) {
        name = n;
        data = d;
        path = p;       
        selected = s;       
    }

    public void setName (String n) {
        name = n;
    }

    public void setData (String d) {
        data = d;
    }

    public void setPath (String p) {
        path = p;
    }

    public String getName() {
        return name;
    }

    public String getData() {
        return data;
    }

    public String getPath() {
        return path;
    }

    public boolean isSelected() {
        return selected;
    }

    public void setSelected (boolean s) {
        this.selected = s;
    }

    public int compareTo(Option o) {
        if (this.name != null) {
            return this.name.toLowerCase().compareTo(o.getName().toLowerCase());
        } else {
            throw new IllegalArgumentException();
        }
    }

}

そして最後に、私の XML です。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="wrap_content">

    <TextView android:text="@+id/name" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:id="@+id/label"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="5dp"
        android:textStyle="bold"
        android:textSize="20sp"></TextView>

    <TextView android:text="@+id/size"
        android:layout_below="@+id/label"
            android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:id="@+id/sub"
        android:layout_marginLeft="15dp"
        android:textSize="15sp"></TextView>

    <CheckBox android:id="@+id/check" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:layout_marginLeft="4dp"
        android:layout_marginRight="10dp" android:layout_alignParentRight="true"
        ></CheckBox>
</RelativeLayout>

どこで間違ったのですか?当初、私のコードはリストビューで画像ファイルをリストするためのものでした。その後、チェックボックスを実装しようとしましたができませんでした。

感謝します。

すべてのテストなどのために、コードは今のところかなり乱雑です。

T1 と T2 は、以前ファイル マネージャーを実行していたときのコードです。それを無視することができます。私が推測する現在のコードを台無しにするべきではありません。外してテストしてみます。

これは私のログです。

03-29 18:37:56.086: E/AndroidRuntime(4299): FATAL EXCEPTION: main
03-29 18:37:56.086: E/AndroidRuntime(4299): java.lang.NullPointerException
03-29 18:37:56.086: E/AndroidRuntime(4299):     at sg.joogle.safeit.FileArrayAdapter.getView(FileArrayAdapter.java:98)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.widget.AbsListView.obtainView(AbsListView.java:2033)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.widget.ListView.measureHeightOfChildren(ListView.java:1244)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.widget.ListView.onMeasure(ListView.java:1155)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.view.View.measure(View.java:12723)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:660)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.view.View.measure(View.java:12723)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.view.View.measure(View.java:12723)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:812)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.view.View.measure(View.java:12723)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2092)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.view.View.measure(View.java:12723)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1064)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.os.Looper.loop(Looper.java:137)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at android.app.ActivityThread.main(ActivityThread.java:4424)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at java.lang.reflect.Method.invokeNative(Native Method)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at java.lang.reflect.Method.invoke(Method.java:511)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-29 18:37:56.086: E/AndroidRuntime(4299):     at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

0

o !- null をチェックしますが、その if ブロックの外では、o.getName で setText を割り当てます。その時点で o が本当に null だった可能性はありますか?

于 2013-03-29T21:47:35.290 に答える