如何从BaseAdapter添加Fragment

时间:2018-01-03 10:43:59

标签: java android android-fragments fragment baseadapter

我正在开发一个英日学习应用程序,其中有一堆用户可以刷卡的卡片,并且在每张当前卡片上,用户可以触摸卡片以翻转到卡片的另一侧,显示了这个词的含义。

对于滑动功能,我使用了一个支持setOnItemClick的库SwipeFlingAdapterView。现在我需要做翻转部分。我在这里阅读教程,需要2个片段才能完成翻转: https://developer.android.com/training/animation/cardflip.html

结构Im设置如下:

stack_of_cards_fragment.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    ......
    >
    <com.lorentzos.flingswipe.SwipeFlingAdapterView
        android:id="@+id/swipeFlingAdapterViewFront"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    </com.lorentzos.flingswipe.SwipeFlingAdapterView>
</FrameLayout>

StackOfCardsFragment.java

public class StackOfCardsFragment extends Fragment {
        ArrayList<TestModel> cardsList;
            Context context;


            @Override
            public void onAttach(Context context) {
                super.onAttach(context);
                this.context = context;
            }

            @Nullable
            @Override
            public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
                final View view = inflater.inflate(R.layout.stack_of_cards_fragment,container,false);

                final CardsAdapter arrayCardsAdapter;

                cardsList = new ArrayList<>();
                for (int i = 0; i < 10; i++) {
                    //dump data
                    TestModel model = new TestModel();
                    model.isFlipped = false;
                    cardsList.add(model);
                }
                SwipeFlingAdapterView flingContainer = ButterKnife.findById(view,R.id.swipeFlingAdapterViewFront);

                ButterKnife.bind(this,  view);

                arrayCardsAdapter = new CardsAdapter(context, cardsList);
                flingContainer.setAdapter(arrayCardsAdapter);

                flingContainer.setFlingListener(new SwipeFlingAdapterView.onFlingListener() {
                    @Override
                    public void removeFirstObjectInAdapter() {
                        Log.d("LIST", "removed object!");
                        if(!cardsList.isEmpty())
                        {arrayCardsAdapter.remove(0);}
                    }

                    @Override
                    public void onLeftCardExit(Object dataObject) {

                       Log.e("Swipe Direction","Left");
                    }

                    @Override
                    public void onRightCardExit(Object dataObject) {
                        Log.e("Swipe Direction","Right");
                    }

                    @Override
                    public void onAdapterAboutToEmpty(int itemsInAdapter) {
                        if(!cardsList.isEmpty()) {
                            arrayCardsAdapter.notifyDataSetChanged();
                            Log.d("LIST", "notified");
                        }else Log.e("Check Empty","Its empty");

                    }
                    @Override
                    public void onScroll(float scrollProgressPercent) {
                        Log.e("onScroll", "scrollProgressPercent");
                    }
                });


                flingContainer.setOnItemClickListener(new SwipeFlingAdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClicked(int itemPosition, Object dataObject) {
                        //This is where I want to change the Front Card Fragment to Back Card Fragment.
                    }
                });

                return view;
            }
    }

以下是我努力做的部分。

flash_card_layout.xml

<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/holo_blue_dark">

    <LinearLayout
        android:id="@+id/child_fragment_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
    </LinearLayout>

</LinearLayout>

CardsAdapter.java

公共类CardsAdapter扩展BaseAdapter {     上下文上下文;

ArrayList<TestModel> cardsList;

ViewFlipper viewFlipper;
public CardsAdapter(Context context, ArrayList cardsList ) {
    this.context = context;
    this.cardsList = cardsList;
}

@Override
public int getCount() {
    return cardsList.size();
}

@Override
public Object getItem(final int i) {

    return cardsList.get(i);
}

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

@Override
public View getView(final int i, View view, final ViewGroup viewGroup) {

    if (view == null) {

        LayoutInflater vi = (LayoutInflater) viewGroup.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        view = vi.inflate(R.layout.flash_card_layout, viewGroup, false);


        //This is where I  want to set the Front Card Fragment 
        Fragment frontCardFragment = new EachFrontCardFragment();
        FragmentTransaction transaction = ((VocabularyGameActivity) context).getSupportFragmentManager().beginTransaction();
            transaction.addToBackStack(null);
            transaction.add(R.id.child_fragment_container, frontCardFragment);
            transaction.commit();

        }
        return view;
    }

    public void remove(int i) {
        cardsList.remove(i);
        notifyDataSetChanged();
    }
}

each_card_front_fragment.xml和each_card_back_fragment.xml的一个

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/cardviewfront">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:paddingTop="20dp"
                android:paddingLeft="20dp"
                android:paddingRight="20dp">

                <TextView android:id="@+id/txtWord_cardfront"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="English"
                    android:textStyle="bold"
                    android:textSize="50sp"
                    android:textColor="@android:color/black"
                    android:layout_gravity="center"
                    android:layout_marginTop="20dp"
                    android:layout_marginBottom="50dp"
                    android:layout_marginLeft="4dp"
                    android:layout_marginRight="4dp"/>

            </LinearLayout>

        </android.support.v7.widget.CardView>

    </FrameLayout>

我已经为each_card_front_fragment和each_card_back_fragment创建了2个片段。

我在这里缺少什么?上面的所有代码只显示了StackOfCardsFragment中的cardAdapter(它只是一个背景),但是each_card_front_fragment并没有显示出来。

我已经尝试从(CardsAdapter)BaseAdapter设置一个BroadcastReceiver,发送到VocabulartyActivity,在那里设置each_card_front_fragment但结果相同。

是在BaseAdapter中设置Fragment的任何其他方法吗?

0 个答案:

没有答案