2

Manishkprのチュートリアルを使用して、1) layoutOne: ここでファイルを作成し、2) layoutTwo: 特定のフォルダーに作成されたすべてのファイルのリストビューを表示するアプリを作成しています。

問題: ファイルを作成しても、すぐにリストビューに表示されません。LayoutOne.java で次のコードを使用する必要があることがわかりました。

   LayoutTwo fragment = (LayoutTwo) getFragmentManager().findFragmentByTag("TESTTWO");
            fragment.getAdapter().notifyDataSetChanged();

LayoutTwo.java に次を追加しました。

private static final String TAG = "TESTTWO";

//and the function getAdapter:

public CustomArrayAdapter getAdapter() {

        return adapter;
    }

ただし、 で nullpointer 例外が発生していfragment.getAdapter().notifyDataSetChanged();ます。どうすればこれを解決できますか?これが実際に最善の方法ですか?

編集

myList = new ArrayList<RecordedFile>();

        File directory = Environment.getExternalStorageDirectory();
        file = new File(directory + "/test/");

        File list[] = file.listFiles();

        for (int i = 0; i < list.length; i++) {
            if (checkExtension(list[i].getName()) == true) {

                RecordedFile q = new RecordedFile();
                q.setTitle(list[i].getName());
                q.setFileSize(readableFileSize(list[i].length()));


                myList.add(q);
            }
        }

        adapter = new CustomArrayAdapter(myContext,
                R.layout.listview_item_row, myList);
        listView.setAdapter(adapter);
4

4 に答える 4

8

Manishkpr のチュートリアルを使用して、1) layoutOne: ここでファイルを作成し、2) layoutTwo: 特定のフォルダーに作成されたすべてのファイルのリストビューを表示するアプリを作成しています。

問題: ファイルを作成しても、すぐにリストビューに表示されません。

スワイプするレイアウトが 2 つしかない場合は、両方のビューがメモリ内にあり、アクセスできることを意味します。次に に ID を割り当て、ListViewデータを更新するときに で ID を探し、ListViewそのActivityアダプタを取得して更新します。次のようにします。

ListView list = (ListView) getActivity().findViewById(R.id.theIdOfTheList);
((BaseAdapter)list.getAdapter()).notifyDataSetChanged();

アダプターを呼び出しnotifyDataSetChanged()ても、新しいファイルが表示されないため、ListView は更新されません。その観点からは、データ セットはそのままです。アダプターの外観に応じて、次の 2 つのオプションがあります。

のデータを再構築しますListView。基本的に、 を最初に構築したときに行ったことをやり直しListViewます。そのディレクトリを確認し、すべてのファイルを再リストします。

// create the new file
File directory = Environment.getExternalStorageDirectory();
file = new File(directory + "/test/");
File list[] = file.listFiles();
ListView list = (ListView) getActivity().findViewById(R.id.theIdOfTheList);
// I'm assuming your adapter extends ArrayAdapter(?!?)
CustomArrayAdapter caa = (CustomArrayAdapter) list.getAdapter();
caa.clear();
for (int i = 0; i < list.length; i++) {
     if (checkExtension(list[i].getName())) {
         RecordedFile q = new RecordedFile();
         q.setTitle(list[i].getName());
         q.setFileSize(readableFileSize(list[i].length()));
         caa.add(q);
     }
}

またはRecordFile、新しく作成されたファイルのオブジェクトを手動で作成し、それを既存のアダプターに追加することもできます。

ListView list = (ListView) getActivity().findViewById(R.id.theIdOfTheList);
(CustomArrayAdapter) caa = (CustomArrayAdapter) list.getAdapter();
File newFile = new File("directory" + "/test/theNewFileName.extension");
RecordFile rf = new RecordFile();
rf.setTitle(newFile.getName());
rf.setFileSize(readableFileSize(newFile.length()));
// have a method to return a reference of the data list(or a method
// to add the data directly in the adapter)
List<RecordFile> data = caa.getListData();
data.add(rf);
caa.notifyDataSetChanged();

あなたのアダプターがどのように見えるかわかりませんので、私が言ったことを試してみてください。うまくいかない場合は、アダプターのコードを投稿してください.

于 2013-04-12T17:44:07.457 に答える
1

少し前のプロジェクトでほぼ同じ問題がありました。

解決策は、Observer パターンをアプリケーションに追加することでした。

問題に関する公式ドキュメントをご覧ください。

http://developer.android.com/training/basics/fragments/communicating.html

を保持する で異なるFragmentsを登録すると、何が起こるかということです。どちらかが変化するときはいつでも、あなたは順番に行動し、他の人にいくつかを届けます。ActivityFragmentsFragmentcallbackActivitymessageFragments

次に、たとえばListView特定のものを取得しFragmentて更新するか、やりたいことを何でもできます。

それは本当にシンプルで強力です;-)

于 2013-04-12T23:16:45.773 に答える
1

これは、viewpager が layoutTwo をロードするためだと思いますが、notifyDataSetChanged で更新しないためです。ビューページャーにはメソッドがあるため、LayoutTwoのデータのみを更新しますが、更新されません。 私のpager.setOffscreenPageLimit(1);知る限り、これはデフォルトであるため、次のことが行で発生します:LayoutOneをロードし、LayoutTwoをロードし、layoutOneで物事を行いますレイアウトツーのもの。しかし、ご覧のとおり、その後は load layoutTwo はありません。

非常によく似た問題があり、これは一種の回避策ですが、アクティビティ (およびpager.removeAllViews();) を再起動すると、ユーザーの邪魔をすることなくうまく機能しました。

ただし、これが問題の原因であることを確認するには、ボタンのクリックリスナーのコードに次のように記述します。

viewPager.removeAllViews();
finish();
startActivity(new Intent(MyActivity.this, MyActivity.class));

これで問題が正確に解決されるわけではありませんが、layoutTwo が変更されたかどうかを確認して、問題の原因を突き止めることができます。

于 2013-04-12T16:32:35.210 に答える