對不起,但我找不到解決我的問題的好方法。我正在嘗試使用少量選項卡來執行應用程序(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,然後按回按鈕(鍵盤正在隱藏)?
請說明您downvotes,所以OP知道要解決什麼。 – Cullub
您可能想了解如何讀取logcat錯誤。搜索「由...引起」並在谷歌上搜索它。那就給你提供有關這個問題的信息。找到代碼堆棧跟蹤的錯誤行。 –