我仍在学习并尝试实现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
如果您想更深入地研究Looper
,Handler
和事件线程,建议使用this YouTube video by Douglas Schmidt。