Added this to the view pager adapter. Good to go now.
public int getItemPosition(Object object) {
return POSITION_NONE;
}
On Mar 12, 2:00 pm, tatebn <[email protected]> wrote:
> I've stopped the crashing by making sure notifyDataSetChanged is
> called in a handler on the main thread. But the current web view
> doesn't go away. Other pages show up as their supposed to, but the
> current one is never replaced.
>
> On Mar 9, 5:07 pm, tatebn <[email protected]> wrote:
>
>
>
>
>
>
>
> > I'm using a ViewPager with the android support library to load static
> > html pages into webviews
> > and flip through them similar to a magazine app.
>
> > I can load the initial page fine, which is using loadContentId().
> > When the user clicks on a link I'm calling the same loadContentId()
> > method.
> > When I call this, 1 of 2 things happens.
>
> > Either nothing happens at all. The method runs and my log statements
> > print, but the views
> > do not redraw/change. Or, the app crashes with the "Only the original
> > thread that created a view hierarchy
> > can touch its views." error.
>
> > I can not seem to find a way to do this without the app crashing. How
> > do I reset the adapter on this ViewPager and
> > show new views? I've tried invalidating the view pager. I've tried
> > invalidating the view pager. I've tried using notifyDataSetChanged()
> > in various places. I've tried using a handler to remove the webView
> > from the view pager.
>
> > Here is the pertinent code.
>
> > /**
> > * Loads the internalContentPager with the swipe navigation set
> > for the given content id.
> > * @param contentId
> > */
> > public void loadContentId(String contentId){
> > //this.internalContentAdapter.loadContentWithId(contentId);
> > this.currentContentId = contentId;
>
> > Log.i(TAG, "in load content id " + contentId);
>
> > //this.internalContentPager.removeAllViews();
>
> > if(this.internalContentAdapter == null){
> > InternalContentAdapter adapter = new
> > InternalContentAdapter();
> > adapter.loadContentWithId(contentId);
> > this.internalContentAdapter = adapter;
>
> > this.internalContentPager.setAdapter(this.internalContentAdapter);
> > }
> > else{
> > this.internalContentAdapter.loadContentWithId(contentId);
> > //
> > this.internalContentAdapter.startUpdate(this.internalContentPager);
> > //this.internalContentAdapter.notifyDataSetChanged();
> > }
>
> > this.navigationStack.push(contentId);
>
> > }
>
> > /**
> > * Pager Adapter to handle internal web view pages. This drives
> > the swipe navigation for the internal content.
> > *
> > * @author btate
> > *
> > */
> > private class InternalContentAdapter extends PagerAdapter{
>
> > /** The content objects represented by this pager. */
> > private List<Content> contents;
>
> > /** The starting position. */
> > private int startPosition = 0;
>
> > /** The starting content id. */
> > private String startContentId = null;
>
> > /** Flag for whether or not to set the starting position. */
> > private boolean setPrimary = true;
>
> > @Override
> > public int getCount() {
> > // Send back the contents size
> > return this.contents.size();
> > }
>
> > /**
> > * Create the page for the given position. The adapter is
> > responsible
> > * for adding the view to the container given here, although it
> > only
> > * must ensure this is done by the time it returns from
> > * {@link #finishUpdate()}.
> > *
> > * @param container The containing View in which the page will
> > be
> > shown.
> > * @param position The page position to be instantiated.
> > * @return Returns an Object representing the new page. This
> > does not
> > * need to be a View, but can be some other container of the
> > page.
> > */
> > @Override
> > public Object instantiateItem(ViewGroup container, int
> > position) {
>
> > // Load up the page
> > InternalWebView page = new InternalWebView(ctx, repo);
>
> > page.loadInternalPage(this.contents.get(position).getContentId());
> > page.setInternalWebViewListener(getListener());
>
> > //this.parentActivity.registerForContextMenu(page);
>
> > // Need to add this without the position
> > container.addView(page);
>
> > // I would like this to work, but it doesn't
> > if(this.startPosition == position){
> > Log.i(TAG, "setting primary item with position " +
> > position);
> > this.setPrimaryItem(internalContentPager, position,
> > page);
> > }
>
> > return page;
> > }
>
> > /**
> > * Remove a page for the given position. The adapter is
> > responsible
> > * for removing the view from its container, although it only
> > must ensure
> > * this is done by the time it returns from {@link
> > #finishUpdate()}.
> > *
> > * @param container The containing View from which the page will
> > be removed.
> > * @param position The page position to be removed.
> > * @param object The same object that was returned by
> > * {@link #instantiateItem(View, int)}.
> > */
> > @Override
> > public void destroyItem(View container, int position,
> > Object view) {
> > ((ViewPager)
> > container).removeView((InternalWebView) view);
>
> > /*Message msg = new Message();
> > msg.obj = (InternalWebView) view;
> > mRemovePageHandler.sendMessage(msg);*/
>
> > }
>
> > @Override
> > public boolean isViewFromObject(View view, Object object) {
> > return view==((InternalWebView)object);
> > }
>
> > /**
> > * Called when the a change in the shown pages has been
> > completed. At this
> > * point you must ensure that all of the pages have actually
> > been
> > added or
> > * removed from the container as appropriate.
> > * @param container The containing View which is displaying this
> > adapter's
> > * page views.
> > */
> > @Override
> > public void finishUpdate(ViewGroup container) {
>
> > if(this.setPrimary)
> > // Set the current item
> >
> > internalContentPager.setCurrentItem(this.startPosition);
>
> > this.setPrimary = false;
>
> > }
>
> > @Override
> > public void restoreState(Parcelable arg0, ClassLoader arg1)
> > {}
>
> > @Override
> > public Parcelable saveState() {
> > return null;
> > }
>
> > @Override
> > public void startUpdate(ViewGroup container) {
>
> > }
>
> > /**
> > * Set the contents for the view pager.
> > *
> > * @param contents A List of Content objects to be
> > loaded.
> > * @param startPosition The starting position
> > */
> > public void setContents(List<Content> contents, int
> > startPosition){
> > this.setPrimary = true;
>
> > for(Content tmp : contents){
> > Log.i(TAG, "in set contents " +
> > tmp.getContentId() + " has order
> > in level " + tmp.getOrderInLevel());
> > }
>
> > this.contents = contents;
>
> > // This is a temp solution
> > if(this.startContentId != null){
> > for(Content tmp : this.contents){
> > Log.i(TAG, "start content " +
> > startContentId + " this content
> > " + tmp.getContentId());
> > if(this.startContentId != null &&
> > this.startContentId.equals(tmp.getContentId()))
> > this.startPosition =
> > this.contents.indexOf(tmp);
> > }
> > }
>
> > Log.i(TAG, "notifying data set change");
> > this.notifyDataSetChanged();
>
> > }
>
> > /**
>
> ...
>
> read more »
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en