视图寻呼机中的recyclerview无法加载

时间:2018-03-10 08:44:12

标签: android android-recyclerview android-viewpager android-glide

我正在使用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,它与我的片段类具有完全相同的名称。删除导入解决了这个问题。

2 个答案:

答案 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()));
}

}