我仍在学习并尝试实现PageAdapter,但我不了解某些事情。

public class Card
{
    public Card(final Context iContext, final Class<?> iNextActivity, int iDrawable)
    {
        drawable = iDrawable;
        onClick = new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                //this just opens an activity using Intent
                ActivityManipulator.openActivity(iContext, iNextActivity);
            }
        };
    }
    public View.OnClickListener onClick;
    public int drawable;
}


public class InfiniteCycleViewPagerAdapter extends PagerAdapter {

    public InfiniteCycleViewPagerAdapter(Context iContext, List<Card> iCards)
    {
        cards = iCards;
        context = iContext;
        layoutInflater = LayoutInflater.from(iContext);
    }
    @Override
    public int getCount() {
        return cards.size();
    }
    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view.equals(object);
    }
    @Override
    public void destroyItem(ViewGroup container, int position, Object object)
    {
        container.removeView((View) object);
    }
    @Override
    public Object instantiateItem(ViewGroup container, final int position)
    {
        Log.d("instantiateItem", Integer.toString(position));
        View view = layoutInflater.inflate(R.layout.card_item, container, false);
        ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
        Card card = cards.get(position);
        imageView.setOnClickListener(card.onClick);
        imageView.setImageResource(card.drawable);
        container.addView(view);
        return view;
    }
    Context context;
    LayoutInflater layoutInflater;
    List<Card> cards;
}


初始化:

public class MyActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dashboard);
        List<Card> cards = new ArrayList<>();
        cards.add(new Card(this, ActivityProductList.class, R.drawable.product));
        cards.add(new Card(this, ActivityEmployeeList.class, R.drawable.employee));
        cards.add(new Card(this, ActivityCustomerList.class, R.drawable.customer));

        HorizontalInfiniteCycleViewPager pager = findViewById(R.id.cycle);

        pager.setAdapter(new InfiniteCycleViewPagerAdapter(this, cards));

        Log.d("dashboard::oncreate", "dashboard");
    }

}



如您所见,我有3张卡片馈给PageAdapter对象,为什么我的Log.d("instantiateItem", Integer.toString(position));输出以下内容:


instantiateItem: 0 instantiateItem: 2 instantiateItem: 1 instantiateItem: 1 instantiateItem: 2

我不明白为什么它的02112为何被调用5次?


为什么在我的InfiniteCycleViewPagerAdapter中的InstantiateItem方法之前调用Log.d("dashboard::oncreate", "dashboard");

最佳答案

您看到多次调用instantiateItem的事实很可能与HorizontalInfiniteCycleViewPager的内部实现有关。

我会猜测并推测它可能会实例化当前的“页面”,并将其他“页面”外推到两个“方向”。这样,如果您向左滑动,您将进入第1页,如果向右滑动,您将进入第2页。

您会在Log.d("dashboard::oncreate", "dashboard");之前看到对instantiateItem的调用,因为Android UI线程使用了所谓的Looper(循环执行程序线程是GUI实现的非常常用的方法)。

大约发生了以下情况:


onCreate由UI线程上的UI Looper运行
onCreate期间,调用pager.setAdapter(new InfiniteCycleViewPagerAdapter(this, cards))
ViewPager内部的某个地方有处理初始化的调用。此调用不是直接方法调用,而是在UI Runnable中添加了“初始化” Looper对象(添加Runnables的机制称为Handler)。
“初始化” Runnable在UI Looper内等待完成之前添加的所有其他工作。这项工作包括上述对onCreate的调用
一旦在UI Looper上完成所有其他工作,则在UI线程上运行“初始化” Runnable


如果您想更深入地研究LooperHandler和事件线程,建议使用this YouTube video by Douglas Schmidt

10-05 18:10