【问题标题】:Fragment with list view is not replacing the list when it should?带有列表视图的片段不应该替换列表吗?
【发布时间】:2011-10-05 11:49:22
【问题描述】:

我对 Android 开发还很陌生,所以如果我没有提供您需要的所有信息,我很抱歉。基本上我正在构建一个基本的文件浏览器,但我想通过一个片段中所有文件的列表视图来尝试一些不同的东西。

这是我目前所拥有的:

在我的主要活动中,我有一个 listView 用于所有目录,它有一个调用 stackAFragment 的 onclick 事件:

public class Main extends Activity implements OnItemClickListener {

    private File RootDir;

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

        /**Initialize the current directory when the main activity is created**/
        RootDir = new File("/sdcard/Docs/");
        Files_Main.setCurDir(RootDir);

        ListView l = (ListView) findViewById(R.id.dir_list);
        ArrayAdapter<String> directories = new ArrayAdapter<String>(getApplicationContext(),
                android.R.layout.simple_list_item_1, 
                Files_Main.getFolderList(RootDir));

        l.setAdapter(directories);
        l.setOnItemClickListener(this);
        stackAFragment(RootDir.toString());
    }

    /**
     * Add a Fragment to our stack
     */
    private void stackAFragment(String dir) {
        File myFile = new File(dir);
        Fragment f = new FilesFragment();
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.replace(R.id.files_frag, f);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.addToBackStack(null);
        ft.commit();
    }

我的 FilesFragment 不做任何特别切割的事情,它只是获取我保存在数组列表中的当前目录并获取该目录中的所有文件并在数组适配器中使用该列表,如下所示:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saved) 
    {

        Context c = getActivity().getApplicationContext();
        File curDir = Files_Main.getCurDir();

        Toast.makeText(getActivity(), (curDir.toString()), Toast.LENGTH_SHORT).show();

        /** setup layouts **/
        LinearLayout main = new LinearLayout(c);
        ListView list = new ListView(c);

        /**Get a list of files from the current directory we are viewing**/
        String[] FilesList = Files_Main.getFileList(curDir);

        /**put list into a array adapter**/
        ArrayAdapter<String> files = new ArrayAdapter<String>(getActivity(), 
                android.R.layout.simple_list_item_1, 
                FilesList);

        /**Set list view to contain items from array adapter**/
        list.setAdapter(files);
        list.setOnItemClickListener(this);

        /**Attach the list view to the LinearLayout view**/
        main.addView(list);

        /**Return LinearLayout View with list view as the fragment to display**/
        return main;
    }

但是由于某种原因,当我运行它并进入另一个应该使用不同目录重新调用 stackAFragment 的目录时,它不会替换我很困惑为什么这不起作用的片段。我还使用线性布局并使用按钮而不是列表视图来完成此操作,当您进入新目录时,它可以工作并替换片段。

有人可以帮忙吗?谢谢,因为我很困惑为什么这不起作用。


public void onItemClick(AdapterView<?> parent, View view, int pos, long id) 
    {
        File targetDir;

        ListView l = (ListView) findViewById(R.id.dir_list);
        if(parent.getItemAtPosition(pos).toString() == "...")
        {
            /**
             * This is going up a directory by deleting the last entry of the directory arraylist.
             * **/
            targetDir = Files.getPreviousDir();
            Files.setPreviousDir();
        }
        else
        {
            /**
             * Sets the item clicked on as the target directory we want to browse and adds it
             * to the directory arraylist.
             * **/
            targetDir = new File (Files.getCurDir() + "/" + 
                    parent.getItemAtPosition(pos).toString());

            Files.setCurDir(targetDir);
        }

        ArrayAdapter<String> directories = new ArrayAdapter<String>(getApplicationContext(),
                android.R.layout.simple_list_item_1, 
                Files.getFolderList(targetDir));

        l.setAdapter(directories);
        l.setOnItemClickListener(this);
        stackAFragment(targetDir.toString());
    }

【问题讨论】:

  • 你能发布你的 onItemClick 方法吗?
  • 按要求添加了onitemclick方法,谢谢。
  • 我已经设法以一种被黑的方式解决了我的问题。我基本上发现 layout.xml 中的片段在加载应用程序时正在加载片段类,但将该片段放在顶部。当调用片段替换时,它并没有替换视图,而是创建了一个新片段,该片段堆叠在开始时创建的片段后面。为了解决这个问题,我创建了一个新类,它是一个空的 listfrgament,用于在加载应用程序时初始化片段,然后替换/添加可见的新片段。这很混乱,所以如果有人知道更好的方法,请务必使用它。

标签: android listview android-fragments


【解决方案1】:

我假设 ID 为“dir_list”的 ListView 不在片段中,而只是在 ID 为“files_frag”的 ViewGroup 中......

<LinearLayout
    android:id="@+id/files_frag"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ListView
        android:id="@+id/dir_list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent/>
</LinearLayout>

如果是这样,我想我知道你的问题。 ft.replace() 只替换给定容器中的片段,而不是视图。这是设计使然,也是您的新解决方案有效的原因,因为实际上有一个片段要替换。

为了减少“混乱”,我将创建一个 FoldersFragment 并将 ListView 移入其中,包括您当前在 Main.OnCreate() 中执行的初始化。这将与 FilesFragment 非常相似,然后将该片段添加到 xml 中,就像这样......

<LinearLayout
    android:id="@+id/files_frag"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <fragment
        android:name="com.mypackage.FoldersFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

为了获得奖励积分,请重用 FilesFragments 来处理这两个问题,并且您可以递归地向下钻取文件结构的多个级别:)

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多