【问题标题】:How to clear a listFragments ArrayAdapter (subcalss) and display emptyView如何清除 listFragments ArrayAdapter(子类)并显示 emptyView
【发布时间】:2015-05-21 02:20:30
【问题描述】:

我正在开发一个基本的文件管理器,想知道如何清除 ArrayAdapter 子类(即我的自定义 FileListAdapter)并仍然让 emptyView 显示。如果没有文件,这是我目前制作 ArrayAdapter 的方法:

if(selectedFile.listFiles() == null){
    mAdapter = new FileListAdapter(getActivity(), R.layout.file_item_layout, new File[0]);
    mListView.setAdapter(mAdapter);

这是空视图

mListView.setEmptyView(getActivity().findViewById(android.R.id.empty)); setEmptyText("Empty folder");

这是我的自定义适配器:

public class FileListAdapter extends ArrayAdapter<File> {

private File[] folderContents;
private LayoutInflater inflater;

public FileListAdapter(Context context, int resource, File[] fileList) {
    super(context, resource, fileList);
    folderContents = fileList;
    inflater = LayoutInflater.from(context);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View itemView = convertView;
    if(itemView == null){
        itemView = inflater.inflate(R.layout.file_item_layout, parent, false);
    }

    //find the file
    File currentFile = folderContents[position];

    //fill the view
    ImageView iconImage = (ImageView) itemView.findViewById(R.id.file_icon);
    iconImage.setImageResource(FileType.getTypeImage(FileType.parseType(currentFile)));

    String fileName = currentFile.getName();
    TextView fileNameText = (TextView) itemView.findViewById(R.id.file_name);
    fileNameText.setText(fileName);

    String fileType = FileType.parse(currentFile);
    TextView fileTypeText = (TextView) itemView.findViewById(R.id.file_type);
    fileTypeText.setText(fileType);

    String fileSizeText;

    if(!currentFile.isDirectory()){
        long fileSize = currentFile.length();
        if(fileSize < 1024){
            fileSizeText = fileSize + " Bytes";
        } else if(fileSize >= 1024 && fileSize < 1048576){
            //fileSizeText = (fileSize/1024) + "KB";
            fileSizeText = String.format("%.2f KB", (float)(fileSize/1024.0));
        } else if(fileSize >= 1048576 && fileSize < 1073741824){
            //fileSizeText = (fileSize/1048576) + "MB";
            fileSizeText = String.format("%.2f MB", (float)(fileSize/1048576.0));
        } else {
            //fileSizeText = (fileSize/1073741824) + "GB";
            fileSizeText = String.format("%.2f GB", (float)(fileSize/1073741824.0));
        }
    }
    else{
        File[] dirContents = currentFile.listFiles();
        if(dirContents == null){
            fileSizeText = "N/A";
        } else {
            if(dirContents.length == 1){
                fileSizeText ="1 item";
            }
            else{
                fileSizeText = dirContents.length + " items";
            }
        }
    }
    TextView fileSizeTextView = (TextView)itemView.findViewById(R.id.file_size);
    fileSizeTextView.setText(fileSizeText);

    Date lastModifiedDate = new Date(currentFile.lastModified());
    String lastModifiedText = "<" +lastModifiedDate.getMonth() + "/" + lastModifiedDate.getDate() + "/" + (lastModifiedDate.getYear() + 1900) + ">";
    TextView lastModifiedDateText = (TextView) itemView.findViewById(R.id.last_modified);
    lastModifiedDateText.setText(lastModifiedText);

    return itemView;
}

}

这是列表的布局(将 listview 替换为 gridview 以获得另一个)

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" tools:context="com.pcgeekbrain.madfiles.FileViewFragment">

<ListView android:id="@android:id/list" android:layout_width="match_parent"
    android:layout_height="match_parent" />

<TextView android:id="@android:id/empty" android:layout_width="match_parent"
    android:layout_height="match_parent" android:gravity="center" />

</FrameLayout>

我得到的是一个空白屏幕。文件夹中没有文件时如何让emptyView出现?

提前致谢。

【问题讨论】:

  • 你可以检查:mAdapter .add(null);或 mAdapter = new FileListAdapter(getActivity(), R.layout.file_item_layout, null);
  • null 导致应用崩溃
  • 你可以在 mAdapter .add(new Model()); 之后创建 Model(is File[] of you);
  • 你用过ListFragment吗?

标签: java android android-arrayadapter


【解决方案1】:

更新 3

把它放在你的适配器上

@Override
public int getCount() {
    return folderContents.length;
}

更新 2

// method setEmptyView on ListView

@android.view.RemotableViewMethod
public void setEmptyView(View emptyView) {
    mEmptyView = emptyView;

    // If not explicitly specified this view is important for accessibility.
    if (emptyView != null
            && emptyView.getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
        emptyView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
    }

    final T adapter = getAdapter();
    final boolean empty = ((adapter == null) || adapter.isEmpty()); // <- see that
    updateEmptyStatus(empty);
}

// meanwhile, on ArrayAdapter...
// adapter.isEmpty returns getCount!

public boolean isEmpty() {
    return getCount() == 0;
}

更新

尝试在您的 FileListAdapter 上实现此功能:

public void removeAll() {
    this.folderContents = new File[]{};
}

然后像这样变空:

adapterInstance.removeAll();
adapterInstance.notifyDataChanged();

您需要删除 itens 并调用 notifyDataChanged()。更多详情请查看this 答案。

【讨论】:

  • 您是否考虑过您的“emptyView”可能不会出现?有时我将我的“listView”与高度“match_parent”一起隐藏了“emptyView”。你能检查一下吗?
  • 片段视图是使用匹配父级生成的。
  • 尝试让emptyView不显示listView(你必须把id改成这个测试)
  • 你不放文字!请尝试在 textView 上添加android:text="lorem ipsum"
  • 那么,现在工作了吗?显示在中心使用 layout_gravity='center' 或将 framelayout 更改为 relative ;)
【解决方案2】:

在下面的片段中搜索你的空视图

 @Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ListView listView = (ListView)view.findViewById(android.R.id.list);
    listView.setEmptyView(view.findViewById(android.R.id.empty));

    ArrayAdapter<Session> adapter1 = new ArrayAdapter<Session>(this, android.R.layout.simple_list_item_1, 
            android.R.id.text1, MainController.getInstanz().getItems());
    listView.setAdapter(adapter1);
}

【讨论】:

  • 没有变化。仍然给我空白屏幕
  • 你在扩展 ListFragment 吗?您是否为片段使用了任何自定义布局?
  • 不,我不是,不,我只是在 android studio 中做了一个新的片段(列表)
  • 发布包含列表视图和空视图的布局。
  • 请在上面检查
【解决方案3】:

我相信它的活动/片段可能有很多地方有问题,所以我贴一个例子来说明它应该如何实现一个适配器到“listView”和“emptyView”

HomeActivity.java

package br.com.luiskaufmannsilva.examplefilemanager;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;


public class HomeActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);


        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.content, new FileListFragment())
                .commit();
    }




}

FileListFragment.java

package br.com.luiskaufmannsilva.examplefilemanager;


import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import java.io.File;


/**
 * A simple {@link Fragment} subclass.
 */
public class FileListFragment extends Fragment {


    private ListView listView = null;
    private FileListAdapter adapter = null;

    public FileListFragment() {}


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_file_list, container, false);

        listView = (ListView) view.findViewById(android.R.id.list);

        listView.setEmptyView(view.findViewById(android.R.id.empty));

        final File file = Environment.getExternalStorageDirectory();
        adapter = new FileListAdapter(getActivity().getApplicationContext(), file.listFiles());

        listView.setAdapter(adapter);

        new Handler()
                .postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        adapter.clear();
                        adapter.notifyDataSetChanged();

                        new Handler()
                                .postDelayed(new Runnable() {
                                    @Override
                                    public void run() {
                                        adapter.setFiles(file.listFiles());
                                        adapter.notifyDataSetChanged();
                                    }
                                }, 5 * 1000);


                    }
                }, 5 * 1000);

        return view;
    }


    class FileListAdapter extends ArrayAdapter<File>{

        private LayoutInflater inflater;
        private File[] files;

        public FileListAdapter(Context context, File[] objects) {
            super(context, R.layout.file_item, objects);
            this.files = objects;
            this.inflater = LayoutInflater.from(context);
        }

        public void setFiles(File[] files) {
            this.files = files;
        }

        @Override
        public int getCount() {
            return files.length;
        }

        @Override
        public void clear() {
            files = new File[]{};
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            convertView = inflater.inflate(R.layout.file_item, parent, false);

            //find the file
            File currentFile = files[position];

            //fill the view
            ImageView iconImage = (ImageView) convertView.findViewById(R.id.file_icon);
            iconImage.setImageResource(R.mipmap.ic_launcher); // do not

            TextView fileNameView = (TextView) convertView.findViewById(R.id.file_name);
            fileNameView.setText(currentFile.getName());

            return convertView;
        }
    }

}

activity_home.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".HomeActivity">

    <LinearLayout
        android:orientation="vertical"
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></LinearLayout>

</RelativeLayout>

fragment_file_list.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="br.com.luiskaufmannsilva.examplefilemanager.FileListFragment">

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>

    <TextView
        android:id="@android:id/empty"
        android:text="No itens"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</FrameLayout>

file_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/file_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:textColor="#ff000000"
        android:id="@+id/file_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="br.com.luiskaufmannsilva.examplefilemanager" >

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".HomeActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

上面的例子产生了这个:

首字母:

过去五秒

又过了五秒

【讨论】:

  • 处理程序是怎么回事?
  • 不重要,我用它只在5秒后显示,这个link解释它是什么。
  • 不,它不会那样做。现在所有的文字都突然变白了,好像上面还有另一个片段。并且文字仍然一直显示。感谢您破坏了我的应用程序。
  • 另外,如果我进入一个包含可用片段的文件夹,顶部的片段会保留在那里。为什么文字是白色的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 2016-08-31
  • 1970-01-01
  • 2015-11-25
  • 2013-02-26
  • 1970-01-01
相关资源
最近更新 更多