0

對不起,但我找不到解決我的問題的好方法。我正在嘗試使用少量選項卡來執行應用程序(viewpager)每個選項卡都是不同的片段。我想要做的是點擊一個標籤/片段中的按鈕,然後更新另一個列表視圖內容。 Listview本身包含來自網站的搜索結果。要進行搜索,我需要將2個搜索參數作爲字符串傳遞。列表視圖在Asynctask中,我使用jsoup來解析網站內容。應用程序啓動後,每次嘗試時都會出現錯誤。Android:在viewpager選項卡中阻止和更新listview內容

我的代碼(進口跳過)

MainActivity

public class MainActivity extends AppCompatActivity{ 

    private DrawerLayout mDrawerLayout; 
    private Menu menu; 
    private NavigationView navView; 

    public static String nazwaStanowiska; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     final ActionBar ab = getSupportActionBar(); 
     ab.setHomeAsUpIndicator(R.drawable.ic_menu); 
     ab.setDisplayHomeAsUpEnabled(true); 

     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 

     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     if (navigationView != null) { 
      setupDrawerContent(navigationView); 
     } 

     ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); 
     if (viewPager != null) { 
      setupViewPager(viewPager); 
     } 

     TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
     tabLayout.setupWithViewPager(viewPager); 


     navView = (NavigationView)findViewById(R.id.nav_view); 
     Menu m = navView.getMenu(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.sample_actions, menu); 

     MenuItem item = menu.add("Cokolwiek"); 
     item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 
      @Override 
      public boolean onMenuItemClick(MenuItem item) { 

       return false; 
      } 
     }); 
     return true; 
    } 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 

     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case android.R.id.home: 
       mDrawerLayout.openDrawer(GravityCompat.START); 
       return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    private void setupViewPager(ViewPager viewPager) { 
     Adapter adapter = new Adapter(getSupportFragmentManager()); 
     adapter.addFragment(new SearchFragment(), "Search"); 
     adapter.addFragment(new ProbaListFragment(), "Results"); 
     viewPager.setAdapter(adapter); 
    } 

    private void setupDrawerContent(NavigationView navigationView) { 
     navigationView.setNavigationItemSelectedListener(
       new NavigationView.OnNavigationItemSelectedListener() { 
        @Override 
        public boolean onNavigationItemSelected(MenuItem menuItem) { 
         menuItem.setChecked(true); 
         mDrawerLayout.closeDrawers(); 
         return true; 
        } 
       }); 
    } 

    static class Adapter extends FragmentPagerAdapter { 
     private final List<Fragment> mFragments = new ArrayList<>(); 
     private final List<String> mFragmentTitles = new ArrayList<>(); 

     public Adapter(FragmentManager fm) { 
      super(fm); 
     } 

     public void addFragment(Fragment fragment, String title) { 
      mFragments.add(fragment); 
      mFragmentTitles.add(title); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return mFragments.get(position); 
     } 

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

     @Override 
     public CharSequence getPageTitle(int position) { 
      return mFragmentTitles.get(position); 
     } 
    } 
} 

SearchFragment - 這個片段,buttonClick後,應派2串ProbaListFragment。我知道在分段激活通信中,建議使用接口,但首先我想讓所有工作都完成。只要我將字符串傳遞給另一個片段,例如textview就行。

public class SearchFragment extends Fragment { 

    private View view; 
    static Button mButton; 
    private EditText mMiejsce, mStanowisko, mProba; 
    public static boolean isButtonClicked = false; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     view = inflater.inflate(R.layout.search_fragment, container, false); 


     mStanowisko = (EditText)view.findViewById(R.id.stanowisko); 
     mMiejsce = (EditText)view.findViewById(R.id.miejscePracy); 

     mProba = (EditText)view.findViewById(R.id.proba); 

     mButton = (Button)view.findViewById(R.id.buttonSearch); 
     mButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       ReceiveFragment.setmyText(mStanowisko.getText().toString()); 
       //ProbaListFragment.cleanMyJobList(); 
       ProbaListFragment.setmyText(mStanowisko.getText().toString(), mMiejsce.getText().toString()); 
       //isButtonClicked = true; 
      } 
     }); 
     return view; 
    } 
} 

和ProbaListFragment本身:

public class ProbaListFragment extends Fragment{ 

    public Elements jobName, jobName2, jobNameComp, jobName2Comp; 

    static List<String> mListaTest1 = new ArrayList<>(); 
    static List<String> mListaTest2 = new ArrayList<>(); 
    static List<String> mListaLinki = new ArrayList<>(); 

    private View view; 
    private Button mButton; 
    private JazzyListView mListView; 
    static ArrayList<String> jobList = new ArrayList<String>(); 
    private JobListAdapter mAdapter; 

    static String tekstPrzekazany; 
    static String doURLwork; 
    static String doURLplace; 


    ViewPager viewPager; 


    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     view = inflater.inflate(R.layout.activity_listview, container, false); 


     viewPager = (ViewPager) getActivity().findViewById(R.id.viewpager); 

     mListView = (JazzyListView) view.findViewById(R.id.list); 
     mListView.setTransitionEffect(new FanEffect()); 
     mListView.setItemsCanFocus(true); 
     //Progress bar 
     //mListView.setEmptyView(view.findViewById(R.id.progressBarLoading)); 

     new NewThread().execute(); 

     // Toast.makeText(getApplicationContext(), "Wyszukiwanie ofert...", Toast.LENGTH_LONG).show(); 


     mAdapter = new JobListAdapter(getContext(), jobList); 
     mListView.setAdapter(mAdapter); 

     mAdapter.notifyDataSetChanged(); 

     mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Toast.makeText(getContext(), "Siema", Toast.LENGTH_LONG).show(); 



       viewPager.setCurrentItem(0); 
      } 
     }); 

     return view; 
    } 

    public static void setmyText(final String stringWork, String stringPlace) { 

     doURLwork = stringWork; 
     doURLplace = stringPlace; 
    } 

    @Override 
    public void onResume() { 
     mAdapter.notifyDataSetChanged(); 
     super.onResume(); 
    } 

    public class NewThread extends AsyncTask<String, Void, String> { 
     @Override 
     protected String doInBackground(String... strtext) { 

      //String doURLwork = mainActiv.nazwaStanowiska; 
      //doURLwork = "kierowca"; 
      //String doURLplace = mainActiv.nazwaMiejscowosci; 
      //doURLplace = "Wroclaw"; 

      Document doc, doc2, docProba; 
      Elements classs, lins, elProba; 
      String uerele; 
      try { 
       doc = (Document) Jsoup.connect("http://www.infopraca.pl/praca?q=" + doURLwork + "&lc=" + doURLplace) 
         .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0").get(); 
       doc2 = (Document) Jsoup.connect("http://www.pracuj.pl/praca/" + doURLwork + ";kw/" + doURLplace + ";wp") 
         .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0").get(); 

       docProba = (Document) Jsoup.connect("http://www.infopraca.pl/praca/junior-java-developer/wroclaw/11774542?vj4=1") 
         .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0").get(); 

       elProba = docProba.select("div#txt-descryption"); 


       //Elements info = docProba.select("div#txt-description") 

       //Oferty 
       jobName = doc.select("h2.p-job-title a[href]"); //Infopraca 
       jobName2 = doc2.select("h2.offer__list_item_link a[href]"); //pracuj.pl 

       //Firmy 
       jobNameComp = doc.select("h3.p-name.company a[href]"); //Infopraca 
       jobName2Comp = doc2.select("h3.offer__list_item_link a[href]"); //pracuj.pl 

       //Oferty pracy 
       //Infopraca 
       mListaTest1.clear(); 
       for (Element jobNames : jobName) { 
        mListaTest1.add(jobNames.text() + "\n"); 
       } 

       //Pracuj.pl 
       for (Element jobNames2 : jobName2) { 
        mListaTest1.add(jobNames2.text() + "\n"); 
       } 
       if(mListaTest1.size()==0){ 
        Toast.makeText(getContext(), "Zmie? parametry wyszukiwania!", Toast.LENGTH_LONG).show(); 
       } 

       //-------------------------------------------------- 

       //Firmy 
       //Infopraca 
       mListaTest2.clear(); 
       for (Element jobNames : jobNameComp) { 
        mListaTest2.add(jobNames.text() + "\n"); 
       } 

       //Pracuj.pl 
       for (Element jobNames2 : jobName2Comp) { 
        mListaTest2.add(jobNames2.text() + "\n"); 
       } 

       //Linki do ofert 
       //Infopraca 
       for (Element link : jobName) { 
        mListaLinki.add(link.attr("abs:href")); 
       } 

       //Pracuj.pl 
       for (Element link : jobName2) { 
        mListaLinki.add(link.attr("abs:href")); 
       } 

       jobList.clear(); 
       for(int i=0; i<mListaTest1.size(); i++){ 
        jobList.add(mListaTest1.get(i)+"\n"+mListaTest2.get(i)); 
       } 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 
    } 
} 

如何解決它,所以它可以在一個良好的工作方式? 另一個問題是 - 我可以動態添加一個新標籤嗎? 我的意思 - 例如 - 當用戶點擊按鈕,結果(列表視圖)的標籤/片段出現?或者在按鈕點擊之後出現標籤,因爲現在它在應用程序的開始處可見,如果按鈕已被按下或沒有按鈕,則無關緊要。

我的logcat:

java.lang.RuntimeException: An error occured while executing doInBackground() 
      at android.os.AsyncTask$3.done(AsyncTask.java:299) 
      at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
      at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
      at java.lang.Thread.run(Thread.java:841) 
    Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
      at android.os.Handler.<init>(Handler.java:197) 
      at android.os.Handler.<init>(Handler.java:111) 
      at android.widget.Toast$TN.<init>(Toast.java:324) 
      at android.widget.Toast.<init>(Toast.java:91) 
      at android.widget.Toast.makeText(Toast.java:238) 
      at com.support.android.designlibdemo.ProbaListFragment$NewThread.doInBackground(ProbaListFragment.java:174) 
      at com.support.android.designlibdemo.ProbaListFragment$NewThread.doInBackground(ProbaListFragment.java:128) 
      at android.os.AsyncTask$2.call(AsyncTask.java:287) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
            at java.lang.Thread.run(Thread.java:841) 

PLZ借給我一些幫助你們!

編輯:也請告訴我爲什麼我的列表視圖只出現在SearchFragment中的EditText,所以鍵盤出現,然後我去ProbaListFragment,然後按回按鈕(鍵盤正在隱藏)?

+0

請說明您downvotes,所以OP知道要解決什麼。 – Cullub

+0

您可能想了解如何讀取logcat錯誤。搜索「由...引起」並在谷歌上搜索它。那就給你提供有關這個問題的信息。找到代碼堆棧跟蹤的錯誤行。 –

回答

0

「無法在未調用Looper.prepare()的線程中創建處理程序」。您嘗試觸摸某個視圖,以在不是屬性的線程中顯示文本。

Toast.makeText(getContext(), "Zmie? parametrywyszukiwania!", Toast.LENGTH_LONG).show(); 

,如果你想顯示敬酒將其放在runOnUithread或使用處理器

相關問題