java - Android:目录和子目录列出连续 Activity 问题

标签 java android android-listview

我正在尝试创建一个目录列表,其中显示文件夹名称的列表。如果用户单击目录名称并且该目录包含子目录,则将调用一个新 Activity ,列出所有子目录。并且这个过程将会持续下去。 我已经创建了第一页的列表,但现在由于它是一个连续循环过程,我应该使用哪种方法。 这个父 Activity 可以调用自身吗,或者我应该使用 startActivity 作为结果,或者 ViewFlipper 或其他任何东西。请提出建议。

编辑[添加代码:]

主 Activity 类

public class MainActivity extends ListActivity implements OnClickListener {

    Button done, cancel, selectAll;

    ListView listView;
    ArrayAdapter<Directory> adapter;
    List<Directory> list;
    HashMap<String, Boolean> checkedMap;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            setContentView(R.layout.main);

            done = (Button) findViewById(R.id.bDone);
            cancel = (Button) findViewById(R.id.bCancel);
            selectAll = (Button) findViewById(R.id.bSelAll);
            done.setOnClickListener(this);
            cancel.setOnClickListener(this);

            new AsyncHandler(this).execute();
            if (list != null) {
                checkedMap = new HashMap<String, Boolean>();
                Iterator<Directory> i = list.iterator();
                while (i.hasNext()) {
                    Directory d = (Directory) i.next();
                    checkedMap.put(d.getName(), d.isSelected());
                }
            }
        } catch (Exception e) {
            Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        // super.onListItemClick(l, v, position, id);
        Directory d = list.get(position);
        File[] subDir = d.getFile().listFiles();
        // TODO: UPDATE ACTIVITY
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
        case R.id.bDone:
            // Update CheckedMap in DB
            // Toast.makeText(this, m_checkedMap.values().toString(),
            // Toast.LENGTH_LONG).show();
            break;
        case R.id.bCancel:
            this.finish();
            break;
        }
    }

    public class AsyncHandler extends AsyncTask {

        Context context;

        public AsyncHandler(Context c) {
            context = c;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Toast.makeText(context, "In onPreExecute()", Toast.LENGTH_SHORT)
            // .show();
        }

        @Override
        protected Object doInBackground(Object... arg0) {
            getList();
            return null;
        }

        @Override
        protected void onPostExecute(Object result) {
            // super.onPostExecute(result);
            setListAdapter(new ElementAdapter(context, list));
        }

        private void getList() {
            list = new ArrayList<Directory>();
            File root = new File("/");
            File[] files = root.listFiles();
            for (File f : files) {
                if (f.isDirectory() && !f.isHidden()) {
                    list.add(new Directory(f, f.getName()));
                }
            }
        }
    }
}

自定义适配器

public class ElementAdapter extends ArrayAdapter {

    private Context context;
    private List<Directory> list;

    public ElementAdapter(Context c, List<Directory> list) {
        super(c, R.layout.row, list);
        this.context = c;
        this.list = list;
    }

    static class ViewHolder {
        protected TextView textView;
        protected CheckBox checkBox;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        View view = convertView;
        if (view == null) {
            LayoutInflater inflator = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflator.inflate(R.layout.row, null);
            viewHolder = new ViewHolder();
            viewHolder.textView = (TextView) view.findViewById(R.id.tvElement);
            viewHolder.checkBox = (CheckBox) view.findViewById(R.id.checkBox1);
            viewHolder.checkBox
                    .setOnCheckedChangeListener(new OnCheckedChangeListener() {

                        @Override
                        public void onCheckedChanged(CompoundButton buttonView,
                                boolean isChecked) {
                            int getPosition = (Integer) buttonView.getTag();
                            list.get(getPosition).setSelected(
                                    buttonView.isChecked());
                        }
                    });
            view.setTag(viewHolder);
            view.setTag(R.id.tvElement, viewHolder.textView);
            view.setTag(R.id.checkBox1, viewHolder.checkBox);
        } else {
            viewHolder = (ViewHolder) view.getTag();
        }
        viewHolder.checkBox.setTag(position);
        viewHolder.textView.setText(list.get(position).getName());
        viewHolder.checkBox.setChecked(list.get(position).isSelected());

        return view;
    }
}

最佳答案

请参阅上面“user370305”的评论。

关于java - Android:目录和子目录列出连续 Activity 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11446821/

相关文章:

android - 获取自定义Listview Android中的总行数

java - 读取目录中的所有文件名

java - 如何按值对 TreeMap 中的键进行排名?

java - 如何在不使用控件的情况下调整线路的音量

android - Appcelerator 可以访问 Phonegap 不能访问的 Apple 和 Android 设备的哪些 native API?

android - 使用 rawQuery 和 CursorAdapter 时如何关闭我的 Cursor

android - 具有多项选择的 ExpandableListView 将所选项目保存到数组中

java - 我如何使用 String 变量而不是在 android 中使用 R.id.webview1

java - 如何获取android中已安装应用程序的缓存大小

java - Android&Javadoc : @inheritDoc is not working