2015-01-12 4 views
0

Я относительно новичок в использовании фрагментов и затрудняюсь выяснить, как перезагрузить мой список, который был инициализирован в 'BaseFragment', в то время как im в 'FragmentActivity' Я использую загрузчик изображений Universial с помощью listview и корректно работать в моем проекте, мне просто нужно выяснить, как его перезагрузить, не перезагружая всю деятельность.Обновить список через фрагменты

вот мой Basefragment, где я считаю, что ListView сначала инициализируется:

public class ImageListFragment extends AbsListViewBaseFragment { 

    public static final int INDEX = 0; 
    String[] imageUrls = Constants2photo.IMAGES.toArray(new String[Constants2photo.IMAGES.size()]); 

    DisplayImageOptions options; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     options = new DisplayImageOptions.Builder() 
       .showImageOnLoading(R.drawable.ic_stub) 
       .showImageForEmptyUri(R.drawable.ic_empty) 
       .showImageOnFail(R.drawable.ic_error) 
       .cacheInMemory(true) 
       .cacheOnDisk(true) 
       .considerExifParams(true) 
       .displayer(new RoundedBitmapDisplayer(20)) 
       .build(); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fr_image_list, container, false); 
     listView = (ListView) rootView.findViewById(R.id.lister); 
     ((ListView) listView).setAdapter(new ImageAdapter()); 
     listView.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       startImagePagerActivity(position); 
      } 
     }); 
     return rootView; 
    } 
... 

А вот мой фрагмент активности OnCreate:

@Override общественного недействительными OnCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState);

int frIndex = getIntent().getIntExtra(Constants2photo.Extra.FRAGMENT_INDEX, 0); 
Fragment fr; 
String tag; 
int titleRes; 
switch (frIndex) { 
    default: 
    case ImageListFragment.INDEX: 
     tag = ImageListFragment.class.getSimpleName(); 
     fr = getSupportFragmentManager().findFragmentByTag(tag); 
     if (fr == null) { 
      fr = new ImageListFragment(); 
     } 
     titleRes = R.string.ac_name_image_list; 
     break; 
    case ImagePagerFragment.INDEX: 
     tag = ImagePagerFragment.class.getSimpleName(); 
     fr = getSupportFragmentManager().findFragmentByTag(tag); 
     if (fr == null) { 
      fr = new ImagePagerFragment(); 
      fr.setArguments(getIntent().getExtras()); 
     } 
     titleRes = R.string.ac_name_image_pager; 
     break; 

} 

setTitle(titleRes); 
getSupportFragmentManager().beginTransaction().replace(android.R.id.content, fr, tag).commit(); 

}

EDIT

Изображение класса адаптера:

class ImageAdapter extends BaseAdapter { 

     private LayoutInflater inflater; 
     private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener(); 

     ImageAdapter() { 
      inflater = LayoutInflater.from(getActivity()); 
     } 

     @Override 
     public int getCount() { 
      return imageUrls.length; 
     } 

     @Override 
     public Object getItem(int position) { 
      return position; 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      View view = convertView; 
      final ViewHolder holder; 
      if (convertView == null) { 
       view = inflater.inflate(R.layout.item_list_image, parent, false); 
       holder = new ViewHolder(); 
       holder.text = (TextView) view.findViewById(R.id.text); 
       holder.image = (ImageView) view.findViewById(R.id.image); 
       view.setTag(holder); 
      } else { 
       holder = (ViewHolder) view.getTag(); 
      } 

      holder.text.setText("Item " + (position + 1)); 

      ImageLoader.getInstance().displayImage(imageUrls[position], holder.image, options, animateFirstListener); 

      return view; 
     } 
    } 

Так как же я перезагружать ListView из фрагмента деятельности? дайте мне знать, если мне нужно опубликовать больше кода, действительно застрял на этом.

ответ

1

Сделайте что-нибудь подобное в своем фрагменте

ПРИМЕЧАНИЕ Кажется, вы используете образцы универсального загрузчика изображений (nostra). В образце они используют AbsListView, метод getAdapter возвращает ListAdapter, а notifyDataSetChanged() не является его частью. Вот почему вы должны отдать свой адаптер BaseAdapter

public void refresh() 
{ 
    ((BaseAdapter)this.listView.getAdapter()).notifyDataSetChanged(); 
} 

и обновить это сделать в вашей деятельности

Fragment fr = getSupportFragmentManager().findFragmentById(R.id.content); 
if(fr instanceOf ImageListFragment) 
    ((ImageListFragment)fr).refresh(); 
+0

я получаю 'не могу метод разрешения notifyDataSetChanged() 'в базовом фрагменте – BluGeni

+0

См. мой отредактированный ответ. Попробуй это. – Rohit5k2

+0

В каком классе расширяется класс 'ImageAdapter'? – Rohit5k2

0

В вашей ImageListFragment вы можете создать такой метод, как:

public void updateList(){ 
    this.ListView.getAdapter().notifyDataSetChanged(); 
    ...other stuff you wanna do to refresh your list.... 

}

И тогда в вашей деятельности вы можете обновить свой список в вашем фрагменте, когда вы хотите от:

fr = new ImageListFragment(); 

... 

fr.updateList(); 
+0

Я получаю 'не может разрешить метод notifyDataSetChanged()' в базовом фрагменте – BluGeni

Смежные вопросы