2016-10-07 13 views
0

私は、ウェブサイトからXMLファイルからデータを取得し、これらのデータをFragmentに渡すアプリケーションを作成しています。同じフラグメントを複数回使用するにはどうすればいいですか?

私はAction Barを使用していますが、3つのタブとViewPagerもあります。 フラグメントにはListViewが含まれています。Bundleを使用してデータを渡すと、フラグメントから渡されたデータを正しく取得できます。

public Fragment getItem(int i){ 
    switch(i){ 
    case 0: 
     Bundle b1= new Bundle(); 
     b1.putString("cat", "artufonews"); 
     Fragment f1 = new LoadFrag(); 
     f1.setArguments(b1); 
     return f1; 
    case 1: 
     Bundle b2 = new Bundle(); 
     b2.putString("cat", "artufo"); 
     Fragment f2 = new LoadFrag(); 
     f2.setArguments(b2); 
     return f2; 
    case 2: 
     Bundle b3 = new Bundle(); 
     b3.putString("cat", "artmyst"); 
     Fragment f3 = new LoadFrag(); 
     f3.setArguments(b3); 
     return f3; 
    default : 
     return new LoadMee(); 
    } 
} 

LoadFragは、私が持っている断片です。私は正しくデータを渡すことができましたが、リストビューをmPager.getAdapter().notifyDataSetChanged()で更新しようとすると、それらの3つのタブは、私が何をしても同じリストを表示します。

public static class LoadFrag extends Fragment{ 
    String cat; 
    boolean kl = false; 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 

     //new TestAsync().execute(); 
     View rootView = inflater.inflate(R.layout.listfrage, container, false); 
     ListView viewer; 
     String[] hell = (String[])list.toArray(new String[list.size()]); 

     final String[] tots = (String[])links.toArray(new String[links.size()]); 
     cat = getArguments().getString("cat"); 
     CustomLister lister = new CustomLister(getActivity(), hell, bmps); 
     viewer = (ListView)rootView.findViewById(R.id.lister); 
     viewer.setAdapter(lister); 
     viewer.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      public void onItemClick(AdapterView<?> parent, View view, int position, long id){ 
       Toast.makeText(getActivity(), "You clicked: item " + tots[position], Toast.LENGTH_SHORT).show();; 

       Intent i = new Intent(getActivity(), Starter.class); 
       i.putExtra("link", tots[position]); 
       startActivity(i); 
      } 
     }); 
     return rootView;  
    } 

    @Override 
    public void setMenuVisibility(final boolean visible) { 
     super.setMenuVisibility(visible); 
     if (visible && kl == false) { 
      getActivity().setTitle(cat); 
      new TestAsync().execute(); 
      kl = true; 
     } 
    } 

    class TestAsync extends AsyncTask<Void, Integer, String> 
    { 
     String TAG = getClass().getSimpleName(); 

     ProgressDialog dialog; 
     protected void onPreExecute(){ 
      Log.d(TAG + " PreExceute","On pre Exceute......"); 

      dialog = new ProgressDialog(getActivity()); 
      dialog.setMessage("Loading content.."); 
      dialog.setIndeterminate(true); 
      dialog.setCancelable(false); 
      dialog.show(); 
     } 

     protected String doInBackground(Void...arg0) { 
      Log.d(TAG + " DoINBackGround","On doInBackground..."); 


      tasker(cat); 

      return "You are at PostExecute"; 
     } 

     protected void onProgressUpdate(Integer...a){ 
      Log.d(TAG + " onProgressUpdate", "You are in progress update ... " + a[0]); 
     } 

     protected void onPostExecute(String result) { 
      Log.d(TAG + " onPostExecute", "" + result); 
      dialog.dismiss(); 
      mPager.getAdapter().notifyDataSetChanged(); 
    } 


    public void tasker(String tag) 
    { 
     try{ 
      URL url = new URL("http://www.skyovnis.com/test.xml"); 
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder db = dbf.newDocumentBuilder(); 
      Document doc = db.parse(new InputSource(url.openStream())); 
      doc.getDocumentElement().normalize(); 

      NodeList nodeList = doc.getElementsByTagName(tag); 



      for (int i = 0; i < nodeList.getLength(); i++) { 

       Node node = nodeList.item(i); 

       Element fstElmnt = (Element) node; 
       NodeList nameList = fstElmnt.getElementsByTagName("title"); 
       Element nameElement = (Element) nameList.item(0); 
       nameList = nameElement.getChildNodes(); 
       list.add(((Node)nameList.item(0)).getNodeValue()); 

       NodeList websiteList = fstElmnt.getElementsByTagName("link"); 
       Element websiteElement = (Element) websiteList.item(0); 
       websiteList = websiteElement.getChildNodes(); 
       links.add(((Node) websiteList.item(0)).getNodeValue()); 

       NodeList imgLinks = fstElmnt.getElementsByTagName("linkp"); 
       Element imgElement = (Element) imgLinks.item(0); 
       imgLinks = imgElement.getChildNodes(); 
       linksp.add(((Node) imgLinks.item(0)).getNodeValue()); 
      } 

      bmps = new Bitmap[linksp.size()]; 
      String[] imgs = (String[])linksp.toArray(new String[linksp.size()]); 
      for(int i = 0; i < linksp.size(); i++){ 
       URL urls = new URL(imgs[i]); 
       bmps[i] = BitmapFactory.decodeStream(urls.openConnection().getInputStream()); 
      } 

      org.jsoup.nodes.Document docs = Jsoup.connect("http://www.skyovnis.com/arecibo-message/").get(); 
      org.jsoup.select.Elements newsHeadlines = docs.select("div.entry-content p"); 

      for(org.jsoup.nodes.Element ele : newsHeadlines){ 
       hello = hello + ele.text(); 
      } 

     } 
      catch(Exception e){ 
       System.out.println(e); 
      } 
    } 
    } 
} 

基本的に、私は合格したデータから、AsyncTaskが実行され、XMLファイルから読み込む:コードの下

は、断片コードです。フラグメントに渡す文字列は、XMLから検索するためのタグです。すべてのものは、すべてのタブを除いて同じリストを表示します。

私はここで間違っていますか?


EDIT

ViewPagerアダプタ

mAdapter = new MyAdapter(getSupportFragmentManager()); 

mPager = (ViewPager)findViewById(R.id.pager); 
mPager.setAdapter(mAdapter); 

mPager.setOnPageChangeListener(
    new ViewPager.SimpleOnPageChangeListener() { 
     @Override 
     public void onPageSelected(int position) { 
      // When swiping between pages, select the 
      // corresponding tab. 
      getActionBar().setSelectedNavigationItem(position); 
     } 
}); 

マイCustomListerクラス、

package com.ovnis.skybeings; 

import java.net.URL; 
import java.util.List; 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class CustomLister extends ArrayAdapter<String>{ 

    private final Activity context; 
    private final String[] web; 
    private final Bitmap[] bmps; 

    public CustomLister(Activity context, String[] web, Bitmap[] bmps){ 

     super(context, R.layout.list_compon, web); 

     this.context = context; 
     this.web = web; 
     this.bmps = bmps; 
    } 

    @Override 
    public View getView(int pos, View view, ViewGroup parent){ 
     LayoutInflater inflater = context.getLayoutInflater(); 
     View rowView = inflater.inflate(R.layout.list_compon, null, true); 
     TextView txtTitle = (TextView)rowView.findViewById(R.id.txt); 

     ImageView imageView = (ImageView)rowView.findViewById(R.id.img); 
     txtTitle.setText(web[pos]); 

     imageView.setImageBitmap(bmps[pos]); 
     return rowView; 
    } 
} 

Myadapter、

public static class MyAdapter extends FragmentPagerAdapter{ 
    public MyAdapter(FragmentManager fm){ 
     super(fm); 
    } 

    @Override 
    public int getCount(){ 
     return tabs.length; 
    } 

    @Override 
    public Fragment getItem(int i){ 
     switch(i){ 
     case 0: 
      return new LoadMee(); 
     case 1: 
      return new LoadFrag().newInstance("artufonews"); 
     case 2: 
      return new LoadFrag().newInstance("artifos"); 
      default : 
       return new LoadMee(); 
     } 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     return POSITION_NONE; 
    } 

} 
+0

。 –

+0

@ישואוהבאותךそれはできません。あなたは私のsetMenuVisibilityコードを見ることができますか?タブを選択するたびに、アプリのタイトルがフラグメントに渡された文字列に設定されます。それも正しく動作し、それも私のタイトルを変更します。唯一の問題は、すべてのタブが私に同じリストであることを示すことです – Aimkiller

+0

さて、私は間違っていました。あなたの 'cat = getArguments()。getString(" cat ");が表示されません。 'と入力します。 'CustomLister lister = new CustomLister(getActivity()、hell、bmps);'をカテゴリに設定していない可能性がありますか? –

答えて

2

以前に送信したBundleをキャッチする必要があります。以下のようなものを行うことは多分あなたの問題を解決することができます。

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

    Bundle bundle = this.getArguments(); 
    if (bundle != null) { 
    yourStringData= bundle.getString("cat", "DEFAULT_VALUE"); 
    setupYourUIWithTheData(yourStringData); 
    } else { 
     Log.d(TAG, "bundle null"); 
    } 
} 

private void setupYourUIWithTheData(String yourData) { 
    // Process the received data here. 
    // Show all related with the data here. 
} 

---、Fragmentにお勧めの方法を値を渡すUPDATE ---

は静的メソッドがにを追加することですあなたのFragment、のように:

public static LoadFrag newInstance(String category) { 
    LoadFrag fragment = new LoadFrag(); 
    Bundle bundle = new Bundle(); 
    bundle.putString("cat", category); 
    fragment.setArguments(bundle); 
    return fragment; 
} 

その後、あなたは、単にでそれを呼び出すことができます何が悪かったのか

LoadFrag.newInstance("your_category"); 
+0

これを今試してみます – Aimkiller

+0

'newInstance()'を使うための 'Fragment'のリファクタリングがどのように問題解決に役立つのか分かりません。 – Egor

+0

@Egor:答えを追加する前に、コード全体を読んでいません。 opはBundleの読み込みをまだ実装していないと考えます。私はそれをお詫び申し上げます。 –

1

をごMyAdaptergetItemPosition()方法では、あなたはPOSITION_NONEを戻ってきています。つまり、MyAdapter#notifyDataSetChanged()に電話をするたびに、ViewPagerのすべてのフラグメントが再作成されます。 LoadFrag#onCreateView()にログメッセージを追加することで、この動作を確認できます。

public static class LoadFrag extends Fragment{ 
    ... 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
    // Add a Log message here to verify 
    Log.d("LoadFrag", "In onCreateView"); 

     ... 
    } 

    ... 
} 

onCreateView()があなたのAsyncTask完了後たびに呼び出されることに注意してください。 AsyncTaskが完了し、ListViewの初期状態を示した後、基本的にはLoadFragを再作成しています。それは

あなたのデータを更新するために、あなたのCustomLister方法を追加修正する方法

あなたが以前に送信したバンドルをキャッチしていないためであるあなたのAsyncTask
public class CustomLister extends ArrayAdapter<String>{ 
    ... 
    public void updateData(String[] newWeb, Bitmap[] newBmps){ 
     web = newWeb; 
     bmps = newBmps; 
     notifyDataSetChanged(); 
    } 
    ... 
} 

、あなたのCustomListerの参照を取得し、代わりにmPager.getAdapter().notifyDataSetChanged()を呼び出すのデータの新しいセットでlister.updateData()を呼び出し、

+0

それを送信します、修正thoのおかげで。 – Aimkiller

関連する問題