Фрагмент карты отменить отмах

Я пытаюсь использовать библиотеку Cardslib со списком карт, которые я могу смахнуть и отменить. Моя проблема в том, что строка отмены всегда отображается, и нажатие на отмену ничего не делает. После отладки я понял, что моя проблема заключается в том, что CardArrayAdapter требует Контекст, который будет использоваться при попытке получить LinearLayout из недобара. Но когда я передаю основную активность в качестве контекста, она не находит отмены.

Мой код выглядит следующим образом:

MainActivity.java:

    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate( savedInstanceState );
      setContentView( R.layout.main_layout );

      BudgetCardFragment budgetCardFragment = (BudgetCardFragment)getSupportFragmentManager().
            findFragmentById( R.id.fragment_budget_cards );
    }

main_layout.xml:

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fragment_budget_cards"
android:name="com.test.view.fragment.BudgetCardFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.test.Main"
tools:layout="@android:layout/list_content" />

BudgetCardFragment.java:

    public class BudgetCardFragment extends Fragment {
        public BudgetCardFragment(){}

        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View rootView = inflater.inflate( R.layout.fragment_budget_card, container, true );

            CardListView listView = (CardListView)rootView.findViewById(R.id.myList);
            List<Card> cards= new ArrayList<Card>();
            for (int i = 0; i < 3; i++) {
                BudgetCard budgetCard = new BudgetCard( getActivity(), mListCategory.get(i).getName() );
                cards.add( budgetCard );
            }
            BudgetCardAdapter budgetCardAdapter = new BudgetCardAdapter( getActivity(), cards );
            if ( listView != null ) {
                listView.setAdapter( budgetCardAdapter );
            }

            return rootView;
        }
    }

fragment_budget_card.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:tools="http://schemas.android.com/tools"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         tools:context="com.test.Main">

    <it.gmariotti.cardslib.library.view.CardListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/myList"/>

    <!-- Include undo message layout -->
    <include layout="@layout/list_card_undo_message"/>

</RelativeLayout>

BudgetCardAdapter.java:

public class BudgetCardAdapter extends CardArrayAdapter {
    private Context mContext;
    private List<Card> cards;
    public BudgetCardAdapter( Context context, List<Card> cards ) {
        super( context, cards );

        this.mContext = context;
        this.cards = cards;

        //Enable undo controller
        setEnableUndo(true);
    }
    @Override
public int getCount() {
    return cards.size();
}

@Override
public Card getItem(int position) {
    return cards.get(position);
}

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

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

2 ответа

Решение

В этом случае вы должны создать ArrayAdapter в onActivityCreated() метод.

Обратите внимание, чтобы сделать это:

@Override
public Card getItem(int position) {
    return cards.get(position);
}

Таким образом, вы работаете со своими местными картами. Когда вы вызываете добавить, удалить... адаптер работает со своими собственными списками.

Ну, я думаю, я должен был понять это, прочитав еще раз мой вопрос.

Мне нужно передать действие в CardAdapter, но я делаю это в onCreateView(), Когда по жизненному циклу фрагмента я должен предположить, что активность существует в onActivityCreated(),

Поэтому для тех, кто заинтересован в решении этого вопроса, есть исправление для файла BudgetCardFragment.java:

public class BudgetCardFragment extends Fragment {
    public BudgetCardFragment(){}

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate( R.layout.fragment_budget_card, container, false );
    }

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

        CardListView listView = (CardListView)getActivity().findViewById(R.id.myList);
        List<Card> cards = new ArrayList<Card>();
        for (int i = 0; i < 3; i++) {
            BudgetCard budgetCard = new BudgetCard( getActivity(), mListCategory.get(i).getName() );
            cards.add( budgetCard );
        }
        BudgetCardAdapter budgetCardAdapter = new BudgetCardAdapter( getActivity(), cards );
        if ( listView != null ) {
            listView.setAdapter( budgetCardAdapter );
        }
    }
}
Другие вопросы по тегам