我使用了一个外部库,名为“ Diolor刷卡”,并将其附加到Array Adapter
上。在每张卡中,我还需要制作一个View Pager
并带有条形,以显示用户当前正在查看的图像。我遇到的问题是,当我在View Pager上设置OnPageChangeListener
时,它将调用方法onPageSelected
并执行其中的所有代码。这涉及到对createBars
(包括在下面)的调用。但是,createBars
中的所有内容都将执行,包括barHolder.removeAllView
,除了li.inflate
语句。我也尝试使用addView
,但是发生类似的问题。请建议一种方法来解决此问题,并在可能的情况下建议其原因。我已经包含了Array Adapter
和createBars
方法的getView
代码中的代码。让我知道其他代码是否有帮助。
private void createBars(int position, int numItems, LinearLayout barHolder) {
barHolder.removeAllViews();
Log.i("View pager listner", "method called");
for (int i = 0; i < numItems; i++) {
if (i == position) {
li.inflate(R.layout.white_rectangle, barHolder);
} else {
li.inflate(R.layout.transparent_white_rectangle, barHolder);
}
}
}
public View getView(int position, View itemView, ViewGroup parent) {
// all views required for a card
final ProgressBar homeProgressBar;
final TextView homeTimeLeft;
TextView homeTitle;
CardView homeItemHolder;
HomeItem item = getItem(position);
final int numItems = item.getItemImages().length;
if (itemView == null) {
itemView = li.inflate(R.layout.home_item, parent, false);
}
homeProgressBar = itemView.findViewById(R.id.home_progressbar);
homeTimeLeft = itemView.findViewById(R.id.home_time_text);
homeTitle = itemView.findViewById(R.id.home_card_title);
homeViewPager = itemView.findViewById(R.id.home_view_pager);
homeViewPager.setOffscreenPageLimit(6);
timeLeftItem = item.getTimeLeftMiliseconds();
homeTitle.setText(item.getTitle());
HomeImageHolder viewPagerAdapter = new HomeImageHolder(context, item.getItemImages());
homeViewPager.setAdapter(viewPagerAdapter);
final LinearLayout barHolder = itemView.findViewById(R.id.home_bars);
createBars(0, item.getItemImages().length, barHolder);
homeViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
Log.i("view pager listner", "it listned");
createBars(position, numItems, barHolder);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
countDownTimer = new CountDownTimer(timeLeftItem, milisecondsInHours) {
@Override
public void onTick(long millisUntilFinished) {
homeTimeLeft.setText(HelperMethods.milisecondsToDays(millisUntilFinished) + " Days "
+ HelperMethods.milisecondsToHours(millisUntilFinished) + " Hours");
homeProgressBar.setProgress(updateProgressBar(millisUntilFinished));
}
@Override
public void onFinish() {
homeTimeLeft.setText("0 Days 0 Hours");
homeProgressBar.setProgress(updateProgressBar(0));
}
};
countDownTimer.start();
return itemView;
}
充气机在监听器外部调用时起作用,但在监听器内部调用时不起作用。这是什么原因?
编辑:我发现添加了数组适配器的类(Diolor的刷卡)在数组中的将来对象上调用getView 4次。这可能是一个潜在的问题。我知道对于给定的卡,侦听器中对酒吧持有人的引用不会更改。我使用Logs和toString方法来确认传递到列表器中的LinearLayout与对应于当前卡的barHolder一致。