我正在使用viewpager开发一个带有多个标签的Android应用。但是,其中一个包含recyclerview的选项卡只是继续加载不停止,如附带的屏幕截图所示。 recyclerview包含图像列表。我能够成功地在其他选项卡中加载imageview和textview,只有包含recyclerview的选项卡才有问题。
适配器:
<?php
// Loading the XML file and updating data to it
$date = date('Y-m-d');
$balanceObj = 10;
$doc = new DOMDocument("1.0", "UTF-8");
$doc->preserveWhiteSpace = false;
$doc->formatOutput = true;
$doc->load('test1.xml');
$months = $doc->getElementsByTagName('month');
$cur_month = (int) date('m');
$cur_date = $date;
$found_month = false;
//echo "<p>Current date: ".$cur_date."</p>";
//echo "<p>Current month: ".$cur_month."</p>";
foreach($months as $month) {
$month_no = (int) $month->getAttribute('month_no');
if($cur_month == $month_no) {
//echo "<p>Found month</p>";
$dailytotals = $month->getElementsByTagName('dailytotal');
$found_date = false;
foreach($dailytotals as $d) {
$this_date = $d->getAttribute('date');
if($this_date === $cur_date) {
// echo "<p>Found date</p>";
$new_dailytotal = $doc->createElement('dailytotal', (float) $balanceObj);
$new_dailytotal->setAttribute('date', $date);
$d->parentNode->replaceChild($new_dailytotal, $d); // (new node, old node)
$found_date = true;
break;
}
}
if($found_date == false) { // entry on a new day
//echo "<p>Didn't found date</p>";
$newDailyTotal = $doc->createElement('dailytotal', (float) $balanceObj);
$newDailyTotal->setAttribute('date', $date);
$m = $month->getElementsByTagName('monthlytotal')->item(0);
$newBalance = ((float) $m->nodeValue) + ((float) $balanceObj);
$newMonthlyTotal = $doc->createElement('monthlytotal', (float) $newBalance);
$m->parentNode->replaceChild($newMonthlyTotal, $m);
$newDailyTotal = $month->appendChild($newDailyTotal);
}
else { // entry on the same day
$m = $month->getElementsByTagName('monthlytotal')->item(0);
// $oldBalance = (float) $m->nodeValue;
// $newBalance = $oldBalance - $oldDailyTotal + $balanceObj;
$newBalance = ((float) $m->nodeValue) + ((float) $balanceObj);
$newMonthlyTotal = $doc->createElement('monthlytotal', (float) $newBalance);
$m->parentNode->replaceChild($newMonthlyTotal, $m);
}
$found_month = true;
break;
}
}
if($found_month == false) {
// echo "<p>Didn't found month</p>";
$newMonthElement = $doc->createElement('month');
$newMonthElement->setAttribute('month_no', $cur_month);
$newDailyTotalElement = $doc->createElement('dailytotal', (float) $balanceObj);
$newDailyTotalElement->setAttribute('date', $date);
$newMonthlyTotalElement = $doc->createElement('monthlytotal', (float) $balanceObj);
$newDailyTotalElement = $newMonthElement->appendChild($newDailyTotalElement);
$newMonthlyTotalElement = $newMonthElement->appendChild($newMonthlyTotalElement);
$newMonthElement = $doc->appendChild($newMonthElement);
}
$doc->save('test1.xml');
?>
片段:
public class MasterListAdapter extends RecyclerView.Adapter<MasterListAdapter.Holder> {
private Context mContext;
private List<Integer> mImageIds;
private LayoutInflater inflater;
@BindView(R.id.images_list_view) ImageView imageView;
public MasterListAdapter(Context context, List<Integer> imageIds) {
mContext = context;
mImageIds = imageIds;
inflater = LayoutInflater.from(context);
}
@Override
public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
return new Holder(inflater.inflate(R.layout.list_view, parent, false));
}
@Override
public void onBindViewHolder(Holder holder, int position) {
Glide.with(mContext).load(mImageIds.get(position)).apply(RequestOptions.fitCenterTransform()).into(imageView);
}
@Override
public int getItemCount() {
return mImageIds.size();
}
public class Holder extends ViewHolder {
public Holder(View itemView) {
super(itemView);
}
}
}
ImageAssets:
public class ListFragment extends BaseFragment {
@BindView(R.id.recyclerView)
RecyclerView recyclerView;
@Override
int getLayoutId() {
return R.layout.fragment_list;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
init();
}
private void init() {
recyclerView.setAdapter(new MasterListAdapter(getContext(),ImageAssets.getImages()));
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
}
}
Viewpager:
public class ImageAssets {
private static final List<Integer> images = new ArrayList<Integer>() {{
add(R.drawable.user);
//add(R.drawable.img2);
//add(R.drawable.img3);
//add(R.drawable.img4);
//add(R.drawable.img5);
//add(R.drawable.img6);
//add(R.drawable.img7);
//add(R.drawable.img8);
//add(R.drawable.img9);
//add(R.drawable.img10);
//add(R.drawable.img11);
//add(R.drawable.img12);
//add(R.drawable.img13);
}};
public static List<Integer> getImages() {
return images;
}
}
list_view.xml
static class ViewPagerAdapter extends FragmentPagerAdapter {
ViewPagerAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
}
@Override
public Fragment getItem(int position) {
return Page.values()[position].getFragment();
}
@Override
public CharSequence getPageTitle(int position) {
return Page.values()[position].getTitle();
}
@Override
public int getCount() {
return Page.values().length;
}
}
enum Page {
First("View") {
@Override
Fragment getFragment() {return new ListFragment();}
};
private String title;
Page(String title) {
this.title = title;
}
String getTitle() {
return title;
}
abstract Fragment getFragment();
}
更新
大家好,感谢您对我的帖子的所有价值回复。我已经找出了无限加载问题的原因。这是因为我意外地在MainActivity中导入了ListFragment,它与我的片段类具有完全相同的名称。删除导入解决了这个问题。
答案 0 :(得分:0)
而不是
@BindView(R.id.images_list_view) ImageView imageView;
试试这个: -
public class Holder extends ViewHolder {
public ImageView imageView;
public Holder(View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.images_list_view);
}
并在onBind
@Override
public void onBindViewHolder(Holder holder, int position) {
Glide.with(mContext)
.load(mImageIds.get(position))
.apply(RequestOptions.fitCenterTransform())
.into(holder.imageView);
}
当你调用静态引用时,你的ImageAssets
构造函数永远不会被调用..所以在你的片段中获取正确的图像列表: -
private void init() {
ImageAssets imageAssets = new ImageAssets(); // add this line to get the images
recyclerView.setAdapter(new MasterListAdapter(getContext(),ImageAssets.getImages()));
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
}
在ImageAssets
类中创建构造函数并初始化images
!!
答案 1 :(得分:0)
找到你的问题。你忘了在Holder课程中绑定你的视图。
public class MasterListAdapter extends RecyclerView.Adapter<MasterListAdapter.Holder> {
private Context mContext;
private List<Integer> mImageIds;
private LayoutInflater inflater;
public MasterListAdapter(Context context, List<Integer> imageIds) {
mContext = context;
mImageIds = imageIds;
inflater = LayoutInflater.from(context);
}
@Override
public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
return new Holder(inflater.inflate(R.layout.list_view, parent, false));
}
@Override
public void onBindViewHolder(Holder holder, int position) {
Glide.with(mContext).load(mImageIds.get(position)).apply(RequestOptions.fitCenterTransform()).into(holder.imageView);
}
@Override
public int getItemCount() {
return mImageIds.size();
}
public class Holder extends ViewHolder {
@BindView(R.id.images_list_view) ImageView imageView;
public Holder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
}
<强>片段强>
public class ListFragment extends BaseFragment {
@BindView(R.id.recyclerView)
RecyclerView recyclerView;
@Override
int getLayoutId() {
return R.layout.fragment_list;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
ButterKnife.bind(this, view);
init();
}
private void init() {
recyclerView.setAdapter(new MasterListAdapter(getContext(),ImageAssets.getImages()));
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
}
}