2013-04-10 3 views
2

Manishkpr에 대한 자습서를 사용하여 1) layoutOne : 여기에서 파일을 만들고 2) layoutTwo : 특정 폴더에있는 모든 생성 된 파일의 목록보기를 스 와이프하여 앱을 만듭니다.다른 조각에서 목록보기 업데이트

문제점 : 파일을 만들면 바로 listview에 표시되지 않습니다. 나는 내 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; 
    } 

을 그러나, 나는 fragment.getAdapter().notifyDataSetChanged();에 nullpointer 예외를 얻고있다. 이 문제를 어떻게 해결할 수 있습니까? 실제로 이것이 가장 좋은 방법입니까?

편집

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); 
+0

아무도 도와 줄 수 있습니까? 지금 며칠 동안 검색하고 그것의 두통을 점점 .. :) –

답변

8

당신이 1 ~ 슬쩍 곳) layoutOne을 A 앱을 만들 수 Manishkpr에 튜토리얼을 사용하고 있습니다 : 여기에 당신은 파일을 생성하고 2) layoutTwo는 : 특정 폴더에있는 모든 생성 된 파일의 목록보기를 보여줍니다.

문제 : 파일을 만들면 목록보기에 바로 표시되지 않습니다.

스 와이프 할 레이아웃이 두 ​​개이면 모두보기가 메모리에 있고 액세스 할 수 있음을 의미합니다. 그런 다음 ListView에 ID를 할당하고 데이터를 단순히 Activity에 그 ListView을 찾아 새로 고침 시간 때,이 같은 자사의 어댑터를 얻을하고 업데이트 할 수 있습니다 :

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

는 상관없이 당신이 notifyDataSetChanged()를 호출하는 경우를 어댑터에서 ListView는 새 파일을 보지 못하기 때문에 업데이트하지 않습니다. 그 관점에서 데이터 세트는 손상되지 않습니다. 귀하의 어댑터에 따라 두 가지 옵션이 있습니다 :

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

내가 어댑터가 보이는 방법을 모른다 작동하지 않으면 어댑터 코드를 게시하십시오.

+0

내 코드에서 어떤 오류도 발생하지 않습니다. 하지만 그것은 ListView를 업데이 트하지 않습니다 ... : 어떤 아이디어? –

+0

@MatthiasVanb 'ListView'가 보여주는 것에 대해 좀 더 설명해 주시겠습니까?특정 디렉토리에서 파일을 "보는"방법은 무엇입니까? (예 : 응용 프로그램 시작시 현재 파일이 어떻게 표시됩니까?) – Luksprog

+0

기본적으로 listFiles() 함수로 가져 오는 폴더의 파일 목록 뷰입니다. 그런 다음 CustomAdapter에서 홀더를 사용하여 올바른 위치에 표시하는 RecordFile 클래스의 인스턴스에 정보를 저장합니다. 코드를 사용하여 질문을 편집했습니다. @Luksprog –

1

나는 viewpager가 layoutTwo를로드하기 때문입니다 생각하지만, 당신이 notifyDataSetChanged으로 새로 고침하지 않습니다. 뷰어에 메서드가 있기 때문에 LayoutTwo의 데이터 만 새로 고치지 만 새로 고치지는 않습니다. pager.setOffscreenPageLimit(1); AFAIK 이것이 기본값이므로 다음 단계로 진행됩니다. layoutOne로드, LayoutTwo로드, layoutOne에서 작업 수행, layout.2에서 일을해라. 그러나 보시다시피로드 레이아웃이 없을 것입니다.

나는 매우 비슷한 문제가 있었지만 일종의 회피 방법 이었지만 활발함 (및 pager.removeAllViews();)을 다시 시작했으며 사용자를 방해하지 않고 잘 작동했습니다.

하지만이 버튼에 ClickListener에 대한 귀하의 코드에 넣고, 문제를 일으키는 것을 확신 할 수 :이 정확히 문제가 해결되지 않습니다

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

하지만 layoutTwo가 chaged 경우에 당신이 할 볼 것 또는 아닙니다, 문제의 원인을 얻습니다.

1

얼마 전에 프로젝트에서 거의 동일한 문제가있었습니다.

해결 방법은 Observer 패턴을 응용 프로그램에 추가하는 것이 었습니다.

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

어떤 일이 것은 당신이 Fragments 보유 Activity와 다른 Fragments을 등록 할 것입니다 :

문제에 대한 공식 문서에서보세요. Fragment 중 하나가 변경 될 때마다 Activity에 을 보내고 누가 다시 message을 다른 하나의 Fragments 중 하나로 전달합니다.

예를 들어 의 ListView을 가져 와서 원하는대로 업데이트 할 수 있습니다.

그것은

0

안녕 어쩌면 조금 늦게는하지만이 작업을 수행하기 위해 고군분투하고 이것이 내가 그것을 할 관리하는 방법입니다 ;-) 정말 간단하고 강력합니다.

확실히 최선의 방법은 아니지만 효과가 있습니다.

조각을 처음 시작할 때 초기화하면 각 인스턴스를 유지 한 다음 인스턴스를 생성할지 여부를 선택할 수 있습니다. 이제

ExampleFragment searchFragment = null; 
ExampleFragment fileListFragment = null; 

다음 그래서 우리가 사용하는 우리의 이전 initialiazed 조각 PagerAdapter 클래스 이제

ExampleFragment searchFragment = null; 
ExampleFragment fileListFragment = null; 

FragmentStatePagerAdapter 변경 : 우리는 내부의 메서드를 호출 할 수 있습니다 이러한 방법으로

class pagerAdapter extends FragmentStatePagerAdapter 
{ 

    public pagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     // getItem is called to instantiate the fragment for the given page. 
     // Return a PlaceholderFragment (defined as a static inner class 
     // below). 
     switch (position) { 
     case 0: 
      if (searchFragment != null) { 
       return searchFragment; 
      } 
      return searchFragment = new ExampleFragment(); 
     case 1: 
      if (downFragment != null) { 
       return downFragment; 
      } 
      return downFragment = new ExampleFragment(); 
     } 
     return null; 
    } 

    @Override 
    public int getCount() { 
     return 2; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     Locale l = Locale.getDefault(); 
     switch (position) { 
     case 0: 
      return getString(R.string.title_section1).toUpperCase(l); 
     case 1: 
      return getString(R.string.title_section2).toUpperCase(l); 
     } 
     return null; 
    } 

} 

을 어떤 단편이나 문맥 문제없이 Main Activity에서 그들과 의사 소통하십시오.

그런 다음 작업 표시 줄의 onTabSelected 메서드 또는 기타 "onChangeTab" 메서드에서 방금 호출 한 메서드를 원하는 부분으로 다시 설정합니다.

@Override 
public void onTabSelected(ActionBar.Tab tab, 
     FragmentTransaction fragmentTransaction) { 
    // When the given tab is selected, switch to the corresponding page in 
    // the ViewPager. 
    if ((tab.getPosition()) == 1) { 
     downFragment.yourMethod(); 
    } 
    mViewPager.setCurrentItem(tab.getPosition()); 
} 

매력적이지는 않지만 매력적입니다.

관련 문제