2

これが私のアプリの仕組みです。ユーザーがサウンドを録音し、特定の名前を付けます。この例では、2 つのサウンド ファイルを録音します。Test1.mp3 と Test2.mp3。最初の記録が終了すると、ダイアログが表示され、「Test1」と入力します。2 回目の記録も同様です。Test1.mp3 と Test2.mp3 がリストビューに追加されました。これはコードです:

//filename is a variable for the name of the file, these lines execute everytime I record a new file
ArrayList<String> fileNames = new ArrayList<String>();
fileNames.add(filename.toString()); 
listView = (ListView) findViewById (R.id.mainListView);
listAdapter = new ArrayAdapter<String>(this, R.layout.simplerow, fileNames);
listView.setAdapter(listAdapter);

したがって、両方のファイルを記録してリストビューに追加した後、onClickListeners を両方のリストビュー要素に設定したいと考えています。しかし、どうすればいいですか?新しい記録ファイルがリストビューに追加されるたびに、onclick メソッドも自動的に生成されるようにするにはどうすればよいですか。これはそれほど複雑ではありませんが、もちろん、記録されたすべてのファイルには異なるパスがあります。

今のコード:

//LISTVIEW
    fileNames.add(filename.toString()); //adding each filename to ArrayList<String>
    listView = (ListView) findViewById (R.id.mainListView);
    listAdapter = new ArrayAdapter<String>(this, R.layout.simplerow, fileNames);
    listView.setAdapter(listAdapter);

    listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            Toast toast = Toast.makeText(getApplicationContext(), filename, Toast.LENGTH_SHORT);
            toast.show();
        }

    });

これは、新しいファイルが記録されるたびに実行されるコードです

4

2 に答える 2

4

リストに要素を追加するたびに新しいリスナーを追加する必要はありません。セットを一度だけ使用することOnItemClickListenerができ、コールバック関数のインデックスによってクリックされたアイテムを見つけることができます

public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3)

つまり、パラメータint position.

onItemClick 実装内で、クリックされた要素を取得できます

arg0.getItemAtPosition(position)

また、毎回 onItemClickListener を追加する必要はありません。Activity の onCreate メソッドで一度準備するだけで、変更する必要はありません。

代わりに、新しいファイルの記録が終了したときに新しいアダプターを作成する (またはアダプターに新しいアイテムを追加する) 必要があります。

ListView の使用方法を示すために、ほぼ完全なサンプルを用意しました。

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

    final ArrayList<String> fileNames = new ArrayList<String>();
    fileNames.add("Test1.mp3");
    fileNames.add("Test2.mp3");

    final ListView listView = (ListView) findViewById (R.id.mainListView);
    ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, fileNames);
    listView.setAdapter(listAdapter);

    listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
            Toast toast = Toast.makeText(getApplicationContext(), 
                    (String)arg0.getItemAtPosition(position), Toast.LENGTH_SHORT);
            toast.show();   
        }
    });
}

リスト内の項目が変わらなければ、これで十分です。

次の mp3 ファイルの録音が終了し、リストにアイテムを追加したい場合は、次のようにします。

ListView listView = (ListView) findViewById (R.id.mainListView);
fileNames.add("Test3.mp3");
((ArrayAdapter<String>)listView.getAdapter()).notifyDataSetChanged();

「Test3」を新しく録音した mp3 のファイル名に置き換えると、リストに表示されます。

于 2013-08-06T00:49:20.377 に答える
0
listview.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {

   switch(position){
    case 0:
    blablbla
    break;
    case1 1:
    blabla
    break;
    /....
    }
    }):
于 2013-08-06T00:37:09.300 に答える