2013-08-06 3 views
1

이 문제를 설명하는 방법에 대해서는 잘 모르겠지만 최선을 다할 것입니다. 나는 소리를 녹음하는 응용 프로그램을 가지고 있고 녹음이 끝나면 파일의 이름을 바꾸어야하고 파일이 다른 활동의 listview에 추가됩니다.항목을 계속 추가하는 동안 각 목록보기 항목에 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); 
} 

마지막으로 내 라이브러리 (listview) 활동에 새 파일 이름이 있습니다.

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

그래서, 매번 나는 그것이 자동으로이 코드 목록보기에 추가되는, 파일 이름을 설정합니다

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 (position){ 
    case 0: 
     //code 
     break; 
} 

하지만 매번 내가 파일을 기록하기 때문에이 내 경우에는 할 수 없습니다 : 나는이 같은 switch 문이 할 수있는 것을 알고있다. 이것은 내가 그것을 시도하는 방법이다 :

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에 추가하십시오. 두 번째 항목을 listview에 추가하자마자 toast는 내가 클릭 한 항목에 상관없이 두 번째 파일의 이름을 표시합니다.

모두가 이해하기를 바랍니다. 더 많은 정보를 추가해야하는지 알려주세요.

해결 방법 :

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

    }); 

당신이 볼 수 있듯이, 나는 단순히 자세한 내용은 this answer를 참조하십시오, 'fileNames.get (ARG2)'에 'filaname'을 변경했습니다.

답변

1

파일 이름을 설정할 때마다 새 ListAdapter를 만들고 설정해서는 안됩니다.

어댑터는 수명주기마다 한 번만 ListView에 연결해야합니다. 두 번째 파일을 다시 추가하면 두 번째 파일 이름 만 반환됩니다. setFileName에 전화 할 때마다 이전 어댑터와 데이터를 무시합니다.

+0

올바른지 또한 onItemClick에서 콜백에 의해 전달되지 않은 토스트에 "filename"을 씁니다. 그러나 어디에서 가져 왔는지 모릅니다. 대신 위치 (arg2)를 확인하고 귀하의 어댑터에있는 각각의 데이터의 파일 이름 – jpm

+0

'onCreate'에 설정 –

+0

@AlexFu 죄송합니다. 단지 답장을하기 전에 방금 정확히 말했기 때문에 내 의견을 삭제했습니다. 그러나 애플리케이션은 여전히 ​​같은 방식으로 작동합니다. jpm이 나에게하라고 한 일을하려고 노력하고 있지만, 어떻게 달성해야할지 모르겠습니다. 어떻게 위치 (arg2)를 확인하고 파일 이름을 그렇게 얻는가? – Guy

1

목록에있는 모든 개체에 onClickListener을 추가 할 필요가 없습니다.당신이 상기 한 바와 같이 당신은 집에 별도의 활동을 사용할 수있어 사용자의 ListView I (1) 당신이 파일에 추가 된 추적 경우 그 활동이 확장 ListActivity (2) onListItemClick

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

} 

이 방법을 사용하여 만들 것 어떤 순서로 (위의 파일 이름을 저장하기 위해 ArrayList을 사용하고 있다고 언급 한 경우), 파일 이름을 검색하기 위해 어떤 종류의 어댑터가 목록을 지원하는지에 따라 position 또는 id 값을 사용할 수 있습니다. 파일 데이터를 검색하는 데 가장 적합한 콜렉션을 재생할 수 있습니다 (예상치 못한 순서로이 값을 추가 및 제거하는 경우 배열 목록이 잘 작동 할 수도 있음).

onItemClickListener을 사용하여이 작업을 수행 할 수도 있습니다. Arg2는 목록에있는 항목의 위치입니다. 그 값을 가져 와서 파일 확장자를 저장하는 ArrayList에서 필요한 파일을 가져 오면됩니다.

관련 문제