2015-05-28 4 views
0

У меня есть 3 фрагмента в viewpager (LeftFragment, MidFragment и Right Fragment) LeftFragment содержит listview, при нажатии на элемент listview изображение будет загружено на MidFragment. Я столкнулся с ошибкой и провел много времени, но все еще не решил. Вот мой код:Загрузить изображение в Viewpager

LeftFragmnet

public class LeftFragment extends Fragment{ 
    private ListView listView; 
    private List<ParseObject> ob; 
    private ProgressDialog mProgressDialog; 
    private ListViewAdapter adapter; 
    private List<School> schoollist = null; 
    private View v; 
    MainActivity mainActivity = new MainActivity(); 
    MidFragment midFragment = new MidFragment(); 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     v = inflater.inflate(R.layout.left_fragment, container, false); 
     initComponent(); 
     new RemoteDataTask().execute(); 
     return v; 
    } 

    private void initComponent() { 
     listView = (ListView)v.findViewById(R.id.lv_left); 
     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       mainActivity.viewPager.setCurrentItem(1); 
       School school = schoollist.get(position); 
//    midFragment.index = Integer.parseInt(school.getIndex()); 
       midFragment.reloadData(Integer.parseInt(school.getIndex())); 
      } 
     }); 
    } 

    private class RemoteDataTask extends AsyncTask<Void, Void, Void> { 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      mProgressDialog = new ProgressDialog(getActivity()); 
      // Create a progressdialog 
      mProgressDialog = new ProgressDialog(getActivity()); 
      // Set progressdialog title 
      mProgressDialog.setTitle("Please wait a moment..."); 
      // Set progressdialog message 
      mProgressDialog.setMessage("Loading..."); 
      mProgressDialog.setIndeterminate(false); 
      // Show progressdialog 
      mProgressDialog.show(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      schoollist = new ArrayList<School>(); 
      try{ 
       ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("School"); 
       query.orderByAscending("index"); 
       ob = query.find(); 
       for (ParseObject name : ob){ 
        School map = new School(); 
        map.setIndex(String.valueOf(name.get("index"))); 
        map.setCount(String.valueOf(name.get("count"))); 
        map.setName(String.valueOf(name.get("name"))); 
        schoollist.add(map); 
       } 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      adapter = new ListViewAdapter(getActivity(), schoollist); 
      listView.setAdapter(adapter); 
      mProgressDialog.dismiss(); 
      super.onPreExecute(); 
     } 
    } 
} 

MidFragment

public class MidFragment extends Fragment { 
    // private ProgressDialog mProgressDialog; 
    private ImageView mImageView; 
    private VideoView mVideoView; 
    private DisplayImageOptions options; 
    private ImageLoader imageLoader = ImageLoader.getInstance(); 
    private Context mContext; 
    private ImageLoadingListener animateFirstListener; 
    private ArrayList<ParseObject> objectList = new ArrayList<>(); 
    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
//   imageLoader.init(ImageLoaderConfiguration.createDefault(mContext)); 
//   mImageLoader = ImageLoader.getInstance(); 
     options = new DisplayImageOptions.Builder() 
       .cacheInMemory(true) 
       .cacheOnDisk(true) 
       .considerExifParams(true) 
       .build(); 
     animateFirstListener = new AnimateFirstDisplayListener(); 
    } 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.mid_fragment, container, false); 


     initComponent(view); 
     mContext = container.getContext(); 
     return view; 

    } 

    private void initComponent(View view) { 
     mImageView = (ImageView) view.findViewById(R.id.image); 
     mVideoView = (VideoView) view.findViewById(R.id.video); 
     mImageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

      } 
     }); 
     mVideoView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

      } 
     }); 
//  mProgressDialog = new ProgressDialog(getActivity()); 
//  mProgressDialog.setTitle("Please wait a moment..."); 
//  mProgressDialog.setMessage("Loading..."); 
//  mProgressDialog.setIndeterminate(false); 
    } 

    public void reloadData(int index){ 
//  mProgressDialog.show(); 
     objectList.clear(); 
     ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("Data"); 
     query.whereEqualTo("school",(Number)index); 
     query.findInBackground(new FindCallback<ParseObject>() { 
      @Override 
      public void done(List<ParseObject> list, ParseException e) { 
       objectList = (ArrayList<ParseObject>) list; 
//    mProgressDialog.dismiss(); 
       if (!list.isEmpty()) 
        openFirst(); 
      } 
     }); 
    } 


    private void openFirst(){ 
     ParseObject parseObject = objectList.get(0); 
     ParseFile parseFile = parseObject.getParseFile("file"); 
     if (parseObject.getNumber("type") == (Number)1){ 

     }else{ 
//   mVideoView.setVisibility(View.GONE); 
//   mImageView.setVisibility(View.VISIBLE); 
      imageLoader.displayImage(parseFile.getUrl(), mImageView, options, animateFirstListener); 
     } 
    } 
    private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener { 

     static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>()); 

     @Override 
     public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
      if (loadedImage != null) { 
       ImageView imageView = (ImageView) view; 
       boolean firstDisplay = !displayedImages.contains(imageUri); 
       if (firstDisplay) { 
        FadeInBitmapDisplayer.animate(imageView, 500); 
        displayedImages.add(imageUri); 
       } 
      } 
     } 
    } 
} 

расположение MidFragment

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <VideoView 
     android:id="@+id/video" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:visibility="gone" /> 

    <ImageView 
     android:id="@+id/image" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:contentDescription="@string/app_name" /> 

</RelativeLayout> 

Logcat

05-28 15:41:56.116 19297-19297/animuco.com.ckemi E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: animuco.com.ckemi, PID: 19297 
    java.lang.IllegalArgumentException: view must not be null 
      at com.nostra13.universalimageloader.core.imageaware.ViewAware.<init>(ViewAware.java:70) 
      at com.nostra13.universalimageloader.core.imageaware.ViewAware.<init>(ViewAware.java:50) 
      at com.nostra13.universalimageloader.core.imageaware.ImageViewAware.<init>(ImageViewAware.java:44) 
      at com.nostra13.universalimageloader.core.ImageLoader.displayImage(ImageLoader.java:365) 
      at com.nostra13.universalimageloader.core.ImageLoader.displayImage(ImageLoader.java:340) 
      at animuco.com.ckemi.Fragment.MidFragment.openFirst(MidFragment.java:119) 
      at animuco.com.ckemi.Fragment.MidFragment.access$200(MidFragment.java:36) 
      at animuco.com.ckemi.Fragment.MidFragment$3.done(MidFragment.java:101) 
      at animuco.com.ckemi.Fragment.MidFragment$3.done(MidFragment.java:95) 
      at com.parse.Parse$6$1.run(Parse.java:944) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:211) 
      at android.app.ActivityThread.main(ActivityThread.java:5333) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811) 

Я не уверен, но я думаю, что ошибка происходит из-за обновления вида ViewPager жаль моего слабого английского Спасибо за интерес народа

ответ

0

Есть несколько вопросов, с кодом. ИМО.

  • Ваш фрагмент содержит ссылку на его деятельность, у вас уже есть один вызов getActivity().
  • Левый фрагмент содержит ссылку на средний фрагмент - плохая практика.
  • На вашем RemoteDataTask вы вызываете метод super.onPreExecute() в методе onPostExecute(), который обычно не реализуется, но может привести к ошибкам в будущем.

И ответить на ваш вопрос. Вы инициализируете новый экземпляр MidFragment на своем левом фрагменте, который не прикреплен нигде до этого, MidFragment не запускает свой жизненный цикл и не вызывает onCreateView(). Средний фрагмент, используемый LeftFragment, не совпадает с тем, который использует ViewPager.

+0

Вы можете дать себе более конкретное решение - нет, я очень расплывчатый, это мой первый проект с android – Leo

+0

Начните с [link] (http://developer.android.com/training/implementing-navigation/alateral .html), а затем снова прочитайте мой ответ. если у вас есть еще вопрос. не стесняйтесь ответить – EE66

Смежные вопросы