【问题标题】:How i use another Layout in ViewPager within a Fragment?我如何在片段内的 ViewPager 中使用另一个布局?
【发布时间】:2017-01-13 07:12:51
【问题描述】:
public class FormContentViewFragment extends Fragment implements View.OnClickListener {

    private View view;
    private View textView;
    private TextView headerView;
    private TextView fieldInstructionView;
    private ImageButton backButton;
    private ImageButton forwardButton;
    private ProgressBar progressBar;
    private ViewPager viewPager;
    private int number;
    private String value;
    private String fieldinstruction;
    private List<String> headerList = new ArrayList<String>();
    private List<String> fieldInstructionList = new ArrayList<String>();
    private LayoutInflater inflater;
    private FormContentViewAdapter adapter;

    public FormContentViewFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_form_content_view, container, false);
        return view;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        backButton = (ImageButton) view.findViewById(R.id.back_button);
        forwardButton = (ImageButton) view.findViewById(R.id.forward_button);
        progressBar = (ProgressBar) view.findViewById(R.id.progress_bar);

        adapter = new FormContentViewAdapter();
        Log.e("onActivityCreated()......","..........before set adapter........");
        viewPager = (ViewPager) view.findViewById(R.id.view_pager);
        viewPager.setAdapter(adapter);
        Log.e("onActivityCreated()......","..........after set adapter........");

        getViewContent();
    }

    public void getViewContent() {
        MainActivity.showLoader(getActivity());

        final StringRequest stringRequest = new StringRequest(Request.Method.GET, "JSON URL", new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Log.e("Response", ".............." + response);

                try {
                    JSONObject jsonObject = new JSONObject(response);
                    boolean status = jsonObject.getBoolean("status");

                    if (status == true) {
                        JSONArray list = jsonObject.getJSONArray("list");

                        for (int i = 0; i < list.length(); i++) {
                            JSONObject currentData = list.getJSONObject(i);

                            number = currentData.getInt("number");
                            Log.e("number", "....." + number);
                            value = currentData.getString("value");
                            Log.e("value", "....." + value);
                            fieldinstruction = currentData.getString("fieldinstruction");
                            Log.e("fieldInstruction", "......" + fieldinstruction);

                            headerList.add(value);
                            Log.e("headerList...", "......" + headerList);
                            fieldInstructionList.add(fieldinstruction);
                            Log.e("instructioList", "....." + fieldInstructionList);

                            Toast.makeText(getContext(), "Dispaly data", Toast.LENGTH_SHORT).show();
                        }
//                        headerView.setText(headerList.get(1));
//                        fieldInstructionView.setText(fieldInstructionList.toString());
                    }
                    MainActivity.hideLoader();
                } catch (JSONException e) {
                    e.printStackTrace();
                    MainActivity.hideLoader();
                }

                Log.e("number out.....", "....." + number);
                MainActivity.hideLoader();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                String errorResponse = String.valueOf(error.networkResponse.data);
                Log.e("ErrorResponse", "........" + errorResponse);
                MainActivity.hideLoader();
            }
        }) {
        };
        ApplicationController.getInstance().addToRequestQueue(stringRequest);
    }

    @Override
    public void onClick(View view) {

    }

    class FormContentViewAdapter extends PagerAdapter {

        public FormContentViewAdapter(){
            Log.e("FormContentViewAdapter","..............inside....");
            Log.e("headerList1...", "......" + headerList.toString());
            Log.e("instructioList1...", "....." + fieldInstructionList.toString());
            Log.e("FormContentViewAdapter","..............end of it....");
        }

        @Override
        public int getCount() {
            Log.e("headerList1...", "......" + headerList.toString());
            Log.e("instructioList1...", "....." + fieldInstructionList.toString());
            Log.e("value getCount().......","........"+number);
            return number;
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            Log.e("isViewFromObject().....","inside.........");
            return false;
        }

        @Override
        public View instantiateItem(ViewGroup container, int position) {
            Log.e("instantiateItem()......","inside.........");
            textView = inflater.inflate(R.layout.view_pager_content, container, false);

            headerView = (TextView) textView.findViewById(R.id.header_text_view);
            fieldInstructionView = (TextView) textView.findViewById(R.id.instruction_text_view);

            headerView.setText(headerList.get(position));
            Log.e("headerList2.....","............."+headerList.toString());
            fieldInstructionView.setText(fieldInstructionList.toString());
            Log.e("fieldInstructionList2........",".........."+fieldInstructionList.get(position));

            container.addView(textView);

            Log.e("instantiateItem()......","end of it.........");
            return textView;
        }

        @Override
        public void notifyDataSetChanged() {
            super.notifyDataSetChanged();
        }
    }
}

错误:

java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 0, found: 2 Pager id: com.formfilling:id/view_pager Pager class: class android.support.v4.view.ViewPager Problematic adapter: class com.formfilling.FormContentViewFragment$FormContentViewAdapter
                                                                            at android.support.v4.view.ViewPager.populate(ViewPager.java:1171)
                                                                            at android.support.v4.view.ViewPager.populate(ViewPager.java:1120)
                                                                            at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1646)

我有一个片段,在那个 ViewPager 中我想为那个 ViewPager 设置不同的布局所以我还使用适配器在 ViewPager 中设置布局,但它会引发错误 IllegalStateException。我已经为此做了所有事情,但它不起作用。给你的建议

【问题讨论】:

  • 使用 viewpager 代码发布整个 logcat 错误
  • 在 viewpager 中使用片段适配器来实现不同的布局。
  • 在 viewPager.setAdapter(adapter) 之后添加 adapter.notifydatasetchanged();
  • 我尝试了,但它不起作用
  • number = currentData.getInt("number");之后添加adapter.notifyDataSetChanged()

标签: android android-fragments android-viewpager fragment


【解决方案1】:

实际上,您正试图在 pagerAdapter 的 getCount() 方法中直接引用 Activitynumber 变量。当 ViewPager 正在做它的事情时,它会一次又一次地引用适配器。所以它会检查getCount()。但是您的后台线程将number 变量值更改为某个新值,这会导致pagerAdapter 中先前值为0 的值不匹配。因此会抛出 IllegalStateException

注意:getCount() 可能会被 ViewPager 调用多次。在 PagerAdapter 的生命周期内,它必须保持常量

推荐选项是如果您知道要显示多少页,则将 getCount 值保持为某个恒定值,但如果它动态变化,那么只要您的数字发生变化,就有一种方法,您必须再次将适配器设置为 viewPagernotifyDataSetChanged 不适用于这种情况。

您必须在 onResponse 方法中执行类似的操作,如下所示

number = currentData.getInt("number");
viewPager.setAdapter(adapter);

这将再次清除计数并进行新计数,这将是您的新值。

【讨论】:

  • java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.support.v4.view.ViewPager.setAdapter(android.support.v4.view.PagerAdapter)”显示 NullPointerException......
  • @ankit682 你的浏览器是空的??那么你是否让你的viewpager在某处为空?如果是这样,您应该在 onResponse 方法中再次将适配器设置为它之前保持一个空检查。
猜你喜欢
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 2017-07-27
  • 1970-01-01
相关资源
最近更新 更多