0

次のコードがあります。

        final RelativeLayout mFrame3 =  (RelativeLayout) inflater.inflate( R.layout.ptrip, container, false );

        folder = new File(Environment.getExternalStorageDirectory() + "/tc/");
        FilesInFolder = GetFilesData(folder.getAbsolutePath());
        FileSize = GetFileSize(folder.getAbsolutePath());

        for (Map.Entry<String, String> current_file:FilesInFolder.entrySet()) {
            rowsArray.add(new SetRows(R.drawable.ic_launcher, current_file.getKey().toString(), current_file.getValue().toString()));
        }

        adapter = new SetRowsCustomAdapter(getActivity(), R.layout.customlist, rowsArray);
    ListView dataList = (ListView) mFrame3.findViewById(R.id.lvFiles);
        dataList.setAdapter(adapter);

        dataList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View 

v, int position, long id) {
            Toast.makeText(getActivity(), Integer.toString(position), 2000).show();
                // Clicking on items
            //Toast.makeText(getActivity(), FilesInFolder.get(position).toString() + FileLastModified.get(position).toString() + FileSize.get(position).toString(), 2000).show(); //display filename (0)
            //Toast.makeText(getActivity(), folder.toString()+ "/" +FilesInFolder.get(position).toString(), Toast.LENGTH_LONG).show();

            /*File flEachFile = new File(folder.toString()+ "/" + FilesInFolder.get(position).toString()); //read POSITION file
            if (!flEachFile.exists()) { //if file does not exist close
                throw new RuntimeException("File not found");
            }
            Log.e("Testing", "Starting to read");
            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new FileReader(flEachFile));
                StringBuilder builder = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    builder.append(line + "\n");
                }
                // custom dialog
                final Dialog dialog = new Dialog(getActivity());
                dialog.setContentView(R.layout.displayfilecontents);
                dialog.setTitle("Trip Name: " + FilesInFolder.get(position).toString().substring(0, FilesInFolder.get(position).toString().lastIndexOf(".")));

                EditText text = (EditText) dialog.findViewById(R.id.etFileContents);
                if (text != null) {
                    text.setFocusable(false);
                    text.setLongClickable(false);
                    text.setTextIsSelectable(false);
                }
                text.setText(builder);
                Button btnCloseIt = (Button) dialog.findViewById(R.id.btnClose);
                // if button is clicked, close the custom dialog
                btnCloseIt.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        dialog.dismiss();
                    }
                });
                dialog.show();
            }
            catch (Exception e) {
                e.printStackTrace();
            }
            finally {
                if (reader != null) {
                    try {
                        reader.close();
                    }
                    catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }*/
        }
        });

    public HashMap<String,String> GetFilesData(String DirectoryPath) {
        HashMap<String,String> MyFiles = new HashMap<String,String>();
        File f = new File(DirectoryPath);


        File[] files = f.listFiles();
        if (files.length == 0)
            return null;
        else {
            for (int i=0; i<files.length; i++)  {
                if (files[i].getName().endsWith(".tol")) {
                    long lastTime = files[i].lastModified();
                    String fileName = files[i].getName().substring(0, files[i].getName().lastIndexOf("."));

                    String dateString = DateFormat.format("MM/dd/yyyy", new Date(lastTime)).toString();
                    MyFiles.put(fileName, dateString); //Add the new filename and its modification date to the Hasmap
                }
            }
        }

        return MyFiles;
    }

次の行でエラーが発生しています。

File flEachFile = new File(folder.toString()+ "/" + FilesInFolder.get(position).toString());

FiledInFolder.get(position).toString関数がファイル名のみを返す場合にのみ機能しました。

public ArrayList<String> GetFilesData(String DirectoryPath) {
    ArrayList<String> MyFiles = new ArrayList<String>();
    File f = new File(DirectoryPath);

    //f.mkdirs();
    File[] files = f.listFiles();
    if (files.length == 0)
        return null;
    else {
        for (int i=0; i<files.length; i++)  {
            if (files[i].getName().endsWith(".tol")) {
                long lastTime = files[i].lastModified();
                String fileName = files[i].getName().substring(0, files[i].getName().lastIndexOf("."));
                MyFiles.add(fileName); //MyFiles.add(files[i].getName()); if extension is also needed
            }
        }
    }

    return MyFiles;
}

新しい関数は、ファイル名と最終変更日の両方を返します。新しい関数で動作するように、onClickListener で同じ機能を実現するにはどうすればよいですか?

4

2 に答える 2

1

GetFileData 関数は、ArrayList ではなく HashMap を作成しています。位置を使用して HashMap から要素を取得することはできません。代わりに、個々の Hashmap エントリはそのキーを渡すことによって取得されます (ここでのキーはファイル名そのものです)。したがって、実際にはハッシュマップ エントリへの参照が必要です。これを実現するには、View クラスの setTag() および getTag() 関数を使用できます。

あなたが試すことができる他のいくつかの選択肢は

  1. findViewbyId を使用する

    dataList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
    
    
    TextView clicked= (TextView) v.findViewById(R.id.id_of_textview_that_hold_filename);
    String current_file=clicked.getText().toString();
    
    } 
    
  2. 位置を使用して、rowsArray からファイル名を取得してみてください。リスナー内でrowsArrayにアクセスできるようにするために、中間の最終変数を使用する必要がある場合があります

  3. FilesData を、サイズ 2 の文字列配列を保持する ArrayList にします。

GetFileData メソッド内で、サイズ 2 の新しい文字列配列を作成し、ファイル名と変更日を位置 0 & 1 に格納します。次に、この文字列配列を配列リストに追加します。必要な変数を HashMap から ArrayList に変更する必要があります

于 2013-08-06T01:50:47.753 に答える
0

FilesInFolder は Hashmap になったので、マップの最初の要素であるキー (2 番目はタイムスタンプまたはマップの値) である特定の位置 (インデックス) でファイル名を取得したいだけです。したがって、次のようなことができます。

最初にマップ キーをリストに変換します。

List<Value> filenames = new ArrayList<String>(FilesInFolder.keys());

それから:

File flEachFile = new File(folder.toString()+ "/" + filenames.get(position).toString());
于 2013-08-06T02:35:44.557 に答える