将 ViewPager 作为一行放置在 ListView 中 [英] Placing ViewPager as a row in ListView

查看:25
本文介绍了将 ViewPager 作为一行放置在 ListView 中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试将 ViewPager 用作 ListView 中的一行,但出现了奇怪的行为 - 只有第一行有效,但是当我滚动列表时它消失了.当我滚动一个空行时,突然正在查看上面的行.Android 似乎创建了一个寻呼机并将其用于所有行.

这是我启动应用程序时看到的:

这是我的行布局:

<View style="@style/DividerHorizo​​ntalStyle"/></LinearLayout>

这是我的列表适配器:

public class MyFriendsAdapter extends BaseAdapter 实现 OnClickListener {私有 ArrayListmItems;私有上下文 mContext;私有 FragmentManager mFragmentManager;公共 MyFriendsAdapter(上下文上下文,ArrayList 项,FragmentManager fragmentManager){mContext = 上下文;mItems = 物品;mFragmentManager = fragmentManager;}@覆盖公共 int getCount() {返回 mItems.size();}@覆盖公共对象 getItem(int position) {返回 mItems.get(position);}@覆盖public long getItemId(int position) {返回位置;}@覆盖public View getView(int position, View currentView, ViewGroup viewGroup) {持有人持有人= null;if (currentView == null) {currentView = View.inflate(mContext, R.layout.view_list_item_myfriends, null);持有人 = 新持有人();holder.textViewUserName = (TextView) currentView.findViewById(R.id.textViewFriendName);holder.mMyFriendspager = (ViewPager) currentView.findViewById(R.id.pagerMyFriendHabits);currentView.setTag(holder);} 别的 {持有人 = (持有人) currentView.getTag();}holder.textViewUserName.setText(mItems.get(position).getmName());MyFriendPagerAdapter tempMyFriendPagerAdapter = new MyFriendPagerAdapter(mFragmentManager, mItems.get(position).getFriendHabits());holder.mMyFriendspager.setAdapter(tempMyFriendPagerAdapter);返回当前视图;}类持有人{TextView textViewUserName;ViewPager mMyFriendspager;}}

这是我的寻呼机适配器:

public class MyFriendPagerAdapter extends FragmentPagerAdapter {私有 ArrayList习惯;public MyFriendPagerAdapter(FragmentManager fm,ArrayList习惯){超级(调频);mHabits = 习惯;}@覆盖公共片段 getItem(int index) {返回新 FragmentMyFriendPage(mHabits.get(index));}@覆盖公共 int getCount() {返回 mHabits.size();}}

解决方案

每当需要动态添加寻呼机时,都需要使用 ViewPager.setId() 为每个寻呼机设置 ID.

I try to use ViewPager as a row ins ListView but a get a bizarre behaviuor - Only the first row works, but when I scroll the list it disappears. When I scroll an empty row, suddenly the row above is being viewed. It seems like Android creates a single pager and use it for all rows.

This is what I see when I launch the app:

This is my row layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/white"
    android:orientation="vertical"
    android:paddingBottom="2dp" >

    <TextView
        android:id="@+id/textViewFriendName"
        style="@style/TextStyle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/myFriendsBg"
        android:paddingBottom="5dp"
        android:paddingTop="5dp"
        android:text="TextView" />

    <View style="@style/DividerHorizontalStyle_gray" />

        <android.support.v4.view.ViewPager
            android:id="@+id/pagerMyFriendHabits"
            android:layout_width="match_parent"
            android:layout_height="@dimen/DefaultImageHeight" />


    <View style="@style/DividerHorizontalStyle" />

</LinearLayout>

This is my List adapter:

public class MyFriendsAdapter extends BaseAdapter implements OnClickListener {

    private ArrayList<UiD_UserFriend> mItems;
    private Context mContext;
    private FragmentManager mFragmentManager;

    public MyFriendsAdapter(Context context, ArrayList<UiD_UserFriend> items, FragmentManager fragmentManager) {
        mContext = context;
        mItems = items;
        mFragmentManager = fragmentManager;
    }

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

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

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

    @Override
    public View getView(int position, View currentView, ViewGroup viewGroup) {
        Holder holder = null;
        if (currentView == null) {
            currentView = View.inflate(mContext, R.layout.view_list_item_myfriends, null);
            holder = new Holder();
            holder.textViewUserName = (TextView) currentView.findViewById(R.id.textViewFriendName);
            holder.mMyFriendspager = (ViewPager) currentView.findViewById(R.id.pagerMyFriendHabits);
            currentView.setTag(holder);
        } else {
            holder = (Holder) currentView.getTag();
        }

        holder.textViewUserName.setText(mItems.get(position).getmName());
        MyFriendPagerAdapter tempMyFriendPagerAdapter = new MyFriendPagerAdapter(mFragmentManager, mItems.get(position).getFriendHabits());
        holder.mMyFriendspager.setAdapter(tempMyFriendPagerAdapter);

        return currentView;
    }

    class Holder {
        TextView textViewUserName;
        ViewPager mMyFriendspager;
    }
}

This is my pager adapter:

public class MyFriendPagerAdapter extends FragmentPagerAdapter {

    private ArrayList<UiD_Habit> mHabits;

    public MyFriendPagerAdapter(FragmentManager fm, ArrayList<UiD_Habit> habits) {
        super(fm);
        mHabits = habits;
    }

    @Override
    public Fragment getItem(int index) {
        return new FragmentMyFriendPage(mHabits.get(index));
    }

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

解决方案

Whenever you need to dynamically add pagers, you need to set an ID for each pager using ViewPager.setId().

这篇关于将 ViewPager 作为一行放置在 ListView 中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆