3

Я использую скользящее меню/узор ящика в своем приложении. Таким образом, у основной активности есть leftView, который является ListFragment с именем themesFragment(), который загружает набор элементов темы. Когда щелкнут элемент/тема, он заменяет фрагмент на основном представлении, вызывая FeedsFragment (tag). FeedsFragment использует адаптер arraylist для загрузки каналов, которые имеют различные элементы для кликов в каждом элементе списка. Я хочу получить другой экземпляр в методе feedsFragment (тег), когда элемент щелкнут в элементе списка.Вызов фрагмента из списка адаптера

holder.contextView= (TextView) newsView.findViewById(R.id.arcHeader); 
    if (item.hasArc()) { 
     holder.contextView.setVisibility(View.VISIBLE); 
     String arc; 
     try { 
      arc=item.getarc(); 
      holder.contextView.setText(arc); 

      holder.contextView.setOnClickListener(new View.OnClickListener() { 

       //currently it loads a class 
       @Override 
       public void onClick(View v) { 
        Intent i = new Intent(context, SomeClass.class); 
        i.putExtra("tag", arc); 
        context.startActivity(i); 
       } 
      }); 
     } catch (JSONException e) { 

      e.printStackTrace(); 
     } 

    } else { 
     holder.contextView.setVisibility(View.GONE); 
    } 

В настоящее время он загружает новый класс. Я хочу определить фрагмент, а затем перейти к основному действию для замены текущим представлением, но я не могу использовать getSupportFragmentManager() внутри класса адаптера, но только в активности фрагмента или фрагмента. Какая должна быть альтернатива подметанию фрагмента из адаптера?

ответ

3

решаемого его, используя контекст, передаваемый в адаптере списка:

@Override 
public void onClick(View v) { 
    Fragment newFragment = new ListFragmentClass(tag); 
    if (newFragment != null) 
     switchFragment(newFragment); 
} 

private void switchFragment(Fragment newFragment) { 
    if (context == null) 
     return; 
    if (context instanceof MainActivity) { 
     MainActivity feeds = (MainActivity) context; 
     feeds.switchContent(newFragment); 
    } 
} 

Здесь switchContent является метод, определенный в основной деятельности для включения/замены фрагмента, как указано в ответе Джастин В.

+1

should'nt это switchFragment (newFragment); вместо switchFragment (newContent); –

+0

, и это довольно странный 'switchContent' и' switchFragment'. @ Зоя должна придерживаться одного из них, а не того и другого. –

3

То, что я сделал, был создать этот метод в своей основной деятельности и просто назвал его от других классов, чтобы изменить фрагмент:

public void switchContent(Fragment fragment) { 
     mContent = fragment; 
     getSupportFragmentManager().beginTransaction() 
       .replace(R.id.fragment_container, fragment).commit(); 

     slidemenu.showContent(); 

    } 
+0

Этот метод - это то, что я хотел вызвать из класса адаптера списка, и, следовательно, вопрос. Я решил это, используя «контекст приложения», переданный в адаптер списка. –

0

Pass getFragmentManager() как пар ameter в конструкторе вашего адаптера и использовать его.

0

Используйте Interface для подключения бокового выдвижного ящика ListFragment к основной деятельности. Например:

public class LeftDrawer extends ListFragment{ 

    private DrawerCallback mCallback; 

    public interface DrawerCallback{ 
     public void onListClick(String tag); 
    } 

    public void setCallback(DrawerCallback callback){ 
     mCallback = callback; 
    } 

} 

Как Fragments должен иметь пустой конструктор, использовать открытый метод в вашем Fragment установить обратный вызов до завершения FragmentTransaction, добавив его в свой ящик. На этом этапе все, что осталось, сообщает Fragment, что произошел щелчок. То, что вы должны сделать, это на самом деле поймать клик в вашем ListFragment, а не добавлять на onClickListener все виды в вашем адаптере.

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

    /* 
    * Get item at the clicked position from your adapter and 
    * get its string tag before triggering interface 
    */ 
    mCallback.onListClick(tag); 
} 

Используйте метод onListItemClick для этого. Вы получите позицию в списке, которая была нажата, и вы можете легко получить этот элемент у вашего адаптера и получить его значение тега, чтобы вернуться к активности вашего хоста.

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