Вызов фрагмента из адаптера списка

Я использую скользящее меню / шаблон ящика в моем приложении. Таким образом, основное действие имеет leftView, который представляет собой ListFragment с именем themesFragment(), который загружает набор элементов темы. При щелчке элемента / темы он заменяет фрагмент в главном представлении, вызывая тег FeedsFragment(тег). 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() внутри класса адаптера, но только в фрагменте или действии фрагмента. Какой должна быть альтернатива подметанию фрагмента из адаптера?

4 ответа

Решение

Решил это с помощью контекста, переданного в адаптере списка:

@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 - это метод, определенный в вашей основной деятельности для переключения / замены фрагмента в ответе Джастина В.

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

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

        slidemenu.showContent();

    }

Проходить getFragmentManager() в качестве параметра в конструкторе вашего адаптера и использовать его.

Используйте 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 для этого. Вы получите позицию списка, по которой щелкнули, и сможете легко получить этот элемент из вашего адаптера и получить значение его тега для передачи обратно на активность вашего хоста.

Другие вопросы по тегам