如何在安卓中实现视图寻呼机适配器



我正在构建一个像TechCrunch这样的Android应用程序,用户可以在其中滑动文章。

我使用视图寻呼机适配器来执行此操作,但我的应用程序有时崩溃。我在日志猫中遇到的错误是:

java.lang.IllegalStateException:应用程序的 PagerAdapter 更改了适配器的内容而不调用 寻呼机适配器#通知数据集已更改!预计适配器项目数: 40, 找到: 50 寻呼机 ID: com.yslabs.yourstory:id/myviewpager 寻呼机类: 类 android.support.v4.view.ViewPager 有问题的适配器:类 单篇文章。单篇文章$我的寻呼机适配器 at android.support.v4.view.ViewPager.populate(ViewPager.java:962( at android.support.v4.view.ViewPager.populate(ViewPager.java:914( at android.support.v4.view.ViewPager$3.run(ViewPager.java:244( at android.view.Choreographer$CallbackRecord.run(Choreographer.java:747( at android.view.Choreographer.doCallbacks(Choreographer.java:567( at android.view.Choreographer.doFrame(Choreographer.java:535( at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:733( at android.os.Handler.handleCallback(Handler.java:615( at android.os.Handler.dispatchMessage(Handler.java:92( at android.os.Looper.loop(Looper.java:153( at android.app.ActivityThread.main(ActivityThread.java:5034( at java.lang.reflect.Method.invokeNative(Native Method( at java.lang.reflect.Method.invoke(Method.java:511( at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821( at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584( at dalvik.system.NativeStart.main(Native Method(

这是我使用视图页面适配器的类

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并列出代码中的更改时,您应该在此更改后调用notifyDataChanged()。你在哪里打电话给ArticleDataHolder.setData()

最新更新