簡體   English   中英

如何在Android中實現View Pager適配器?

[英]How to implement view pager adapter in android?

我正在構建一個類似於TechCrunch的android應用程序,用戶可以在其中滑動文章。

我曾經使用過View pager適配器來做到這一點,但是我的應用程序有時崩潰了。 我在logcat中收到的錯誤是:

java.lang.IllegalStateException:應用程序的PagerAdapter更改了適配器的內容,而沒有調用PagerAdapter#notifyDataSetChanged! 預期的適配器項數:40,找到的:50尋呼機ID:com.yslabs.yourstory:id / myviewpager尋呼機類:類android.support.v4.view.ViewPager有問題的適配器:類android.support.v4上的singlearticle.SingleArticle $ MyPagerAdapter .view.ViewPager.populate(ViewPager.java:962)在android.support.v4.view.ViewPager.populate(ViewPager.java:914)在android.support.v4.view.ViewPager $ 3.run(ViewPager.java: 244)在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:747)在android.view.Choreographer.doCallbacks(Choreographer.java:567)在android.view.Choreographer.doFrame(Choreographer.java:535)在android.os.Handler.dispatchMessage(Handler.java:92)處的android.os.Handler.handleCallback(Handler.java:615)處的android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:733) .Looper.loop(Looper.java:153)在android.app.ActivityThread.main(ActivityThread.java:5034)在java.lang.reflect.Method.invokeNative(本機方法)在java.lang.reflect.Method.invoke (遇見 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:821)處的com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)處的od.java:511) .NativeStart.main(本機方法)

這是我使用視圖頁面適配器的類

public class SingleArticleAfrica extends Activity {

ConnectionDetector checkConnection;
Boolean isInternetPresent = false;
ViewPager viewPage;
MyPagerAdapter mypageAdapter;


@SuppressWarnings("deprecation")
@SuppressLint({ "InflateParams", "SetJavaScriptEnabled", "HandlerLeak",
        "NewApi" })
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.check);
    viewPage = (ViewPager) findViewById(R.id.myviewpager);
    mypageAdapter = new MyPagerAdapter(this, ArticleDataHolder.getData());
    viewPage.setAdapter(mypageAdapter);

    viewPage.setCurrentItem(ArticleDataHolder.getPosition());

    viewPage.setOnPageChangeListener(new OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            // TODO Auto-generated method stub
            ArticleDataHolder.setPosition(position);
            viewPage.setCurrentItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
            // TODO Auto-generated method stub

        }
    });
     getActionBar().setBackgroundDrawable(
     new ColorDrawable(Color.parseColor("#f8f8f8")));
     ActionBar actionBar = getActionBar();
     actionBar.setDisplayHomeAsUpEnabled(true);
     ActionBar mActionBar = getActionBar();
     mActionBar.setDisplayShowHomeEnabled(true);
     mActionBar.setDisplayShowTitleEnabled(false);
     LayoutInflater mInflater = LayoutInflater.from(this);
     View mCustomView = mInflater.inflate(R.layout.customactionbar, null);
     TextView mTitleTextView = (TextView) mCustomView
     .findViewById(R.id.title_text);
     Typeface fontt = Typeface.createFromAsset(getAssets(),
     "helvetica.ttf");
     mTitleTextView.setTypeface(fontt);
     mActionBar.setCustomView(mCustomView);
     mActionBar.setDisplayShowCustomEnabled(true);
     mActionBar.setLogo(R.drawable.africaicon);

    // String htmldata =
    // "<html><style = text/css>   img{width:100%!important;height:auto!important;}iframe{max-
          width:100%;max-height:100%;}a { color:#3366CC; text-decoration: none; }</style><body   
      style = line-
  height:25px; >"

   }

  @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu items for use in the action bar
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main2, menu);
    return super.onCreateOptionsMenu(menu);
   }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items
    switch (item.getItemId()) {
    case R.id.action_refresh:
        Intent sendIntent = new Intent();
        sendIntent.setAction(Intent.ACTION_SEND);
        sendIntent.putExtra(
                Intent.EXTRA_TEXT,
                ArticleDataHolder.getData()
                        .get(ArticleDataHolder.getPosition()).getTitle()
                        + "\n"
                        + ArticleDataHolder.getData()
                                .get(ArticleDataHolder.getPosition())
                                .getPermalink());
        sendIntent.setType("text/plain");
        startActivity(sendIntent);

        return true;
    case android.R.id.home:
        onBackPressed();
        /*web1.loadUrl("");
        web1.stopLoading();*/
        return true;

    default:
        return super.onOptionsItemSelected(item);
    }
    }

  public class myWebClient extends WebViewClient

   {

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {

        // TODO Auto-generated method stub

        super.onPageStarted(view, url, favicon);

    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {

        // TODO Auto-generated method stub

        view.loadUrl(url);

        return true;

    }

    @Override
    public void onPageFinished(WebView view, String url) {

        // TODO Auto-generated method stub

        super.onPageFinished(view, url);

        // progressBar.setVisibility(View.GONE);

    }

}

// To handle "Back" key press event for WebView to go back to previous
// screen.

@SuppressWarnings("static-access")
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)

{

    if (keyCode == event.KEYCODE_BACK) {
        /*web1.loadUrl("");
        web1.stopLoading();*/

        finish();

    }
    return super.onKeyDown(keyCode, event);

}

private class MyPagerAdapter extends PagerAdapter {

    Context context;
    List<Movie> list;

    public MyPagerAdapter(Context context, List<Movie> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        return arg0 == arg1;
    }

    public Object instantiateItem(ViewGroup container, int position) {
        /* *Title* */

        float titleSize = 25;
        TextView titleView = new TextView(SingleArticleAfrica.this);
        Typeface fontType = Typeface.createFromAsset(getAssets(),
                "helvetica-neue-regular-1361522098.ttf");
        titleView.setTypeface(fontType);
        titleView.setTextSize(titleSize);

        titleView.setBackgroundResource(R.color.list_background);
        titleView.setTypeface(Typeface.DEFAULT_BOLD);
        titleView.setText(list.get(position).getTitle());

        /* * Date * */

        TextView dateView = new TextView(SingleArticleAfrica.this);
        dateView.setTextColor(Color.GRAY);
        dateView.setBackgroundResource(R.color.list_background);
        dateView.setTextSize(14);
        dateView.setPadding(10, 0, 0, 0);
        dateView.setTypeface(Typeface.DEFAULT_BOLD);
        dateView.setText(list.get(position).getAuthor()
                + " "
                + list.get(position)
                        .getDate()
                        .substring(0,
                                list.get(position).getDate().length() - 3));

        /* *Article Content* */

        WebView web1 = new WebView(SingleArticleAfrica.this);
        web1.setWebViewClient(new myWebClient());
        web1.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        web1.getSettings().setJavaScriptEnabled(true);
        web1.getSettings().setDefaultFontSize(18);
        web1.setWebChromeClient(new WebChromeClient());
        web1.getSettings().setPluginState(PluginState.ON_DEMAND);
        String c = single.content;
        c = c.replace("src=\"//", "src=\"https://");
        final String ALLOWED_URI_CHARS = "@#&=*+-_.,:!?()/~'%";
        String htmldata = "<!DOCTYPE html><html><style = text/css> 
        img{width:100%!important;height:auto!important;} iframe{width:100sp;max-height:100sp;}a {     
       color:#3366CC; text-decoration: none; } </style> <body style = 'line-height:25px;'>"
                + list.get(position).getContent() + "</body></html>";
        web1.loadData(htmldata, "text/html; charset=utf-8", null);

        /* *Facebook Comment* */

        WebView fbCommentview = new WebView(SingleArticleAfrica.this);
        fbCommentview.setWebViewClient(new myWebClient());
        fbCommentview.getSettings()
                .setJavaScriptCanOpenWindowsAutomatically(true);
        fbCommentview.getSettings().setJavaScriptEnabled(true);
        fbCommentview.getSettings().setDefaultFontSize(18);
        fbCommentview.setWebChromeClient(new WebChromeClient());
        fbCommentview.getSettings().setPluginState(PluginState.ON_DEMAND);
        checkConnection = new ConnectionDetector(getApplicationContext());
        isInternetPresent = checkConnection.isConnectingToInternet();
        if (isInternetPresent) {
            // Toast.makeText(getApplicationContext(),"Internet Working",
            // Toast.LENGTH_SHORT).show();
            fbCommentview.setVisibility(View.VISIBLE);
        } else {
            // Toast.makeText(getApplicationContext(),"Internet Not Working",
            // Toast.LENGTH_SHORT).show();
            fbCommentview.setVisibility(View.GONE);
        }

        ScrollView scrollView = new ScrollView(SingleArticleAfrica.this);
        LinearLayout layout = new LinearLayout(SingleArticleAfrica.this);
        layout.setOrientation(LinearLayout.VERTICAL);
        layout.addView(titleView);
        layout.addView(dateView);
        layout.addView(web1);
        layout.addView(fbCommentview);

        scrollView.addView(layout);
        container.addView(scrollView);
        return scrollView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        //container.removeView((ScrollView) object);
    }
}
}

這是getPosition類代碼:

  public class ArticleDataHolder {
  static List<Movie> data = new ArrayList<Movie>();

  static int position;

  public static void setData(Movie movie){
    data.add(movie);
}

public static List<Movie> getData(){
    return data;
}

public static void setPosition(int pos){
    position = pos;
}

public static int getPosition(){
    return position;
}
}

請幫我!! 為了讓我更了解這個問題並提出了解決方案。

此錯誤表明您的data(list)大小已更改,但未pagerAdapter.notifyDataChanged() setData和list在代碼中更改時,此更改后應調用notifyDataChanged() 在哪里調用ArticleDataHolder.setData()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM