Android从MySQL读取数据后,在屏幕显示关闭后,listview将填充
我正在尝试从MySQL数据库中获取数据并在listview中显示它。已成功检索数据,但在屏幕显示关闭之前,不会填充listview。在填充listview之前,“进度”对话框也不会出现。有什么建议吗Android从MySQL读取数据后,在屏幕显示关闭后,listview将填充,android,mysql,listview,android-asynctask,Android,Mysql,Listview,Android Asynctask,我正在尝试从MySQL数据库中获取数据并在listview中显示它。已成功检索数据,但在屏幕显示关闭之前,不会填充listview。在填充listview之前,“进度”对话框也不会出现。有什么建议吗 public class BestLinksActivity extends AppCompatActivity { public ListView myListView; public MyListViewAdapter mAdapter; public List<HotelInfo>
public class BestLinksActivity extends AppCompatActivity {
public ListView myListView;
public MyListViewAdapter mAdapter;
public List<HotelInfo> dataSource;
private String cityName;
ProgressDialog mProgressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_best_links);
dataSource = new ArrayList<>();
mProgressDialog = new ProgressDialog(BestLinksActivity.this);
mProgressDialog.setMessage("Loading data...");
Bundle extras = getIntent().getExtras();
if (extras != null) {
cityName = extras.getString("City");
}
DataBaseReader dbReader = new DataBaseReader();
if (!(cityName.equals(null))) {
dbReader.execute(cityName);
} else {
Toast.makeText(getApplicationContext(), "City name not specified", Toast.LENGTH_SHORT).show();
}
//Create adapter
mAdapter = new MyListViewAdapter(getApplicationContext(), dataSource);
//Configure the listview
myListView = (ListView) findViewById(R.id.main_list_view);
myListView.setAdapter(mAdapter);
myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// ListView Clicked item value
HotelInfo currentItem = dataSource.get(position);
//Open url of the currentItem in web browser
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(currentItem.getLinkUrl())));
}
});
}
public String getTitle(String url) {
String[] subStrings = url.split("/");
String urlTitle = "";
for (int i = 0; i < subStrings.length; i++) {
if (subStrings[i].equals("t"))
urlTitle = (subStrings[i + 1]);
}
urlTitle = urlTitle.replace("-", " ");
urlTitle=((urlTitle.charAt(0)+"").toUpperCase()).concat(urlTitle.substring(1));
return urlTitle;
}
public class DataBaseReader extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog.show();
}
@Override
protected String doInBackground(String... params) {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.build();
Log.d("CheckParam", params[0]);
RequestBody postBody = new FormBody.Builder()
.add("cityName", params[0])
.build();
Request myRequest = new Request.Builder()
.url("http://172.18.0.32/extractData.php")
.post(postBody)
.build();
String serverResponse = null;
try {
Response response = okHttpClient.newCall(myRequest).execute();
serverResponse = response.body().string();
} catch (Exception e) {
e.printStackTrace();
}
try {
JSONObject myJsonObj = new JSONObject(serverResponse);
JSONArray myJsonArray = myJsonObj.getJSONArray("server_response");
for (int index = 0; index < myJsonArray.length(); index++) {
JSONObject linkObject = myJsonArray.getJSONObject(index); //Otherwise, you will get last element
HotelInfo myHotelInfo = new HotelInfo();
myHotelInfo.setLinkUrl(linkObject.getString("Link"));
myHotelInfo.setLinkTitle(getTitle(myHotelInfo.getLinkUrl()));
dataSource.add(myHotelInfo);
}
}
catch (JSONException e) {
e.printStackTrace();
}
Log.d("MyKeyser", serverResponse);
return serverResponse;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Log.d("MyKey", s);
if (mProgressDialog!=null && mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
}
}
}
}
公共类BestLinksActivity扩展了AppCompative活动{
公共列表视图myListView;
公共MyListViewAdapter mAdapter;
公共列表数据源;
私有字符串cityName;
进程对话框;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u最佳链接);
dataSource=新的ArrayList();
mProgressDialog=新建进度对话框(BestLinksActivity.this);
setMessage(“正在加载数据…”);
Bundle extras=getIntent().getExtras();
如果(附加值!=null){
cityName=extras.getString(“城市”);
}
DataBaseReader dbReader=新建DataBaseReader();
如果(!(cityName.equals(null))){
dbReader.execute(cityName);
}否则{
Toast.makeText(getApplicationContext(),“未指定城市名称”,Toast.LENGTH_SHORT.show();
}
//创建适配器
mAdapter=新的MyListViewAdapter(getApplicationContext(),数据源);
//配置listview
myListView=(ListView)findViewById(R.id.main\u列表\u视图);
myListView.setAdapter(mAdapter);
myListView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
//ListView单击的项目值
HotelInfo currentItem=dataSource.get(位置);
//在web浏览器中打开当前项的url
startActivity(新意图(Intent.ACTION_视图,Uri.parse(currentItem.getLinkUrl()));
}
});
}
公共字符串getTitle(字符串url){
String[]substring=url.split(“/”);
字符串urlTitle=“”;
for(int i=0;i
将以下行添加到您的onPostExecute
:
mAdapter.notifyDataSetChanged();
您需要通知适配器数据已更改。
看
关于ProgressBar
,您需要将其放在activity\u best\u链接的某个布局下。
最好的方法是不要以编程方式创建它,而是将它添加到xml布局文件中,请参见示例,然后通过mProgress.setVisibility()处理它的可见性代码>由于您的数据源列表已更新,您必须通过调用notifyDatasetChanged()将所述更改通知适配器。很高兴我能提供帮助,请将答案标记为已接受,以便从未回答的队列中删除此问题,并帮助其他人。完成。还有一个问题,如果服务器脱机或没有响应,我如何显示Toast?添加到onPostExecute:if(s==null)Toast.makeText(BestLinksActivity.this,“Hello”,Toast.LENGTH\u SHORT)。show()