2013-08-06 141 views
1

我不太確定如何解釋這個問題,但我會盡我所能。我有一個應用程序可以記錄聲音,並且在完成記錄後,必須重命名文件,然後將文件添加到其他活動的列表視圖中。添加onItemClickListener到每個列表視圖項目,而項目仍然被添加

我有標籤的佈局,所以將文件添加到列表視圖是更復雜一點,這裏就是我如何做到這一點:

錄製活動:

if (getParent() instanceof FileNameProvider) { 
    ((FileNameProvider) getParent()).onNewFileName(newFileName); 
} 

標籤佈局活動:

public void onNewFileName(Editable filename) { 
    LocalActivityManager activityManager = getLocalActivityManager(); 
    getTabHost().setCurrentTabByTag("Library"); 
    RecordedLibrary recLib = (RecordedLibrary) activityManager.getActivity("Library"); 
    recLib.setFileName(filename); 
} 

最後,我得到我的庫(列表視圖)活動中的新文件名:

public void setFileName(final Editable filename) { 
    Log.d("2", "Set filename from first activity " + filename); 
} 

所以,每次我設置一個文件名,它會自動添加,使用此代碼的ListView:

public void setFileName(final Editable filename) { 
    Log.d("2", "Set filename from first activity " + filename); 

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

現在我想接下來做的是還自動添加onItemClickListener每個項目增加。我知道我可以用這樣的switch語句做到這一點:

switch (position){ 
    case 0: 
     //code 
     break; 
} 

但是,這是不可能在我的情況,因爲每次我錄製一個文件,這個文件有不同的路徑,因爲有不同的名稱。這是我想做到這一點:

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(); 
     } 

    }); 

這不起作用,要麼是因爲每次我添加一個新的文件列表視圖,文件名可變的變化,所以這個代碼僅適用,只要我只添加一個項目到列表視圖。只要我將第二個項目添加到listview中,無論我點擊哪個項目,toast都會顯示第二個文件的名稱。

我希望大家都明白這個問題。讓我知道是否應該添加更多信息。

SOLUTION:

listView.setOnItemClickListener(new OnItemClickListener() { 

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

    }); 

正如你所看到的,我只是改變了 'filaname' 到 'fileNames.get(ARG2)',請參閱this answer更多的細節。

回答

1

每次設置文件名時,都不應該創建並設置新的ListAdapter。

適配器只應創建一次並在每個生命週期中連接到一個ListView,這可能是第二次添加文件時,只有第二個文件名被返回的原因。每當您撥打setFileName時,您將覆蓋以前的適配器和數據。

+0

正確,並且在onItemClick中,您將「文件名」寫入未由回調傳遞的Toast(我不知道從哪裏得到),但是應該檢查位置(arg2),然後獲取來自適配器中相應數據的文件名 – jpm

+0

將其設置爲'onCreate' –

+0

@AlexFu對不起,我剛剛刪除了我的評論,因爲我剛剛在答覆之前做了一分鐘,但該應用程序仍以同樣的方式工作。我試圖做jpm告訴我現在要做的事情,但我不知道如何實現這一點。我如何檢查位置(arg2)並以這種方式獲取文件名? – Guy

1

您不需要爲列表中的每個對象添加onClickListener。正如你上面顯示你是使用一個單獨的活動來容納你的ListView我會(1)使這一活動擴展ListActivity(2)使用onListItemClick

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 

} 

這樣,如果你跟蹤哪些文件是在加(您上面提到您使用ArrayList來存儲文件名),您可以使用位置或id值(取決於支持列表的是哪種適配器)來檢索文件名。您可以玩弄哪些收藏最適合檢索文件數據(儘管如果按照可預測的順序添加和刪除這些值,數組列表可能工作正常)。

您也可以使用已有的onItemClickListener來做到這一點。 Arg2是項目在列表中的位置。只需取得該值,並從ArrayList獲取需要的文件來存儲文件擴展名。