等待截击响应,然后更新 ListView
Wait for volley response, then update ListView
我想从 mediawiki api 中提取数据,对其进行解析,然后将标题和段落放入列表视图中。在下面的代码中,我在请求的 onResponse 方法中创建并设置了适配器,因为如果我在外部这样做,请求还不会完成。
我还覆盖了适配器的 getView 方法,因为我想格式化项目,例如粗体和彩色标题。我在另一个项目中测试了这个并且它有效,但是当放在 onResponse 方法中时,这部分不再有任何效果。
我想到的解决方案是等待 volley 完成请求,然后再在主线程上设置列表视图。我已经阅读了有关使用期货和异步任务的解决方案,但它对我不起作用,而且我对它的理解还不足以尝试修复它。谁能帮忙?
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ListView listView = findViewById(R.id.listView);
RequestQueue queue = Volley.newRequestQueue(this);
String url = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=extracts&titles=OSI%20model&exlimit=1";
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Pattern pattern = Pattern.compile("<p>(.*?)</p>|<ul>(?!<li>Mi)(.*?)</ul>|<span id=\\\"((?!Examples|Comparison_with_TCP.2FIP_model|See_also|References|External_links).*?)\\\">");
Matcher matcher = pattern.matcher(response);
ArrayList<String> content = new ArrayList<>();
content.add("OSI Model");
while (matcher.find()){
String s = matcher.group();
s = s.replaceAll("</li>\\n<li>", "\n");
s = s.replaceAll("<p>|</p>|<b>|</b>|<i>|</i>|<ul>|</ul>|<li>|</li>|\\\">", "");
s = s.replaceAll("\\u00e9", "e");
s = s.replaceAll("\\u2013|\\u2014", " - ");
s = s.replaceAll("_|\\n", " ");
s = s.replaceAll("\\\"", "\"");
content.add(s);
}
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,content){
@Override
public View getView(int position, View convertView, ViewGroup parent){
TextView item = (TextView) super.getView(position,convertView,parent);
String itemText = super.getItem(position);
if (itemText.matches("<span id=\\\".+")){
System.out.println("A");
item.setTextColor(Color.parseColor("#FF9933"));
item.setTypeface(item.getTypeface(), Typeface.BOLD_ITALIC);
item.setTextSize(TypedValue.COMPLEX_UNIT_DIP,20);
item.setText(itemText.replaceAll("<span id=\\\"", ""));
}
return item;
}
};
listView.setAdapter(arrayAdapter);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {}
});
queue.add(stringRequest);
}
}
您的manifest.xml
中缺少这个
<uses-permission android:name="android.permission.INTERNET"/>
你的正则表达式是错误的,我建议你使用这个regex-tool看看你做错了什么。
我对您的正则表达式进行了更改,我看到了类似这样的内容:
我改变的是:
if (itemText.matches("<span id=\".+")){
但是如果你这样保留它,你会在滚动时遇到问题,所以你必须做一些棘手的事情。随意修改
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,content){
@Override
public View getView(int position, View convertView, ViewGroup parent){
TextView item = (TextView) super.getView(position,convertView,parent);
String itemText = super.getItem(position);
if (itemText.matches("<span id=\".+")){
item.setTextColor(Color.parseColor("#FF9933"));
item.setTypeface(item.getTypeface(), Typeface.BOLD_ITALIC);
item.setTextSize(TypedValue.COMPLEX_UNIT_DIP,20);
item.setText(itemText.replaceAll("<span id=\\\"", ""));
}
else{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
item.setTextColor(getColor(android.R.color.primary_text_light));
}
item.setTypeface(null,Typeface.NORMAL);
item.setTextSize(14);
item.setText(itemText.replaceAll("<span id=\\\"", ""));
}
return item;
}
我想从 mediawiki api 中提取数据,对其进行解析,然后将标题和段落放入列表视图中。在下面的代码中,我在请求的 onResponse 方法中创建并设置了适配器,因为如果我在外部这样做,请求还不会完成。
我还覆盖了适配器的 getView 方法,因为我想格式化项目,例如粗体和彩色标题。我在另一个项目中测试了这个并且它有效,但是当放在 onResponse 方法中时,这部分不再有任何效果。
我想到的解决方案是等待 volley 完成请求,然后再在主线程上设置列表视图。我已经阅读了有关使用期货和异步任务的解决方案,但它对我不起作用,而且我对它的理解还不足以尝试修复它。谁能帮忙?
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ListView listView = findViewById(R.id.listView);
RequestQueue queue = Volley.newRequestQueue(this);
String url = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=extracts&titles=OSI%20model&exlimit=1";
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Pattern pattern = Pattern.compile("<p>(.*?)</p>|<ul>(?!<li>Mi)(.*?)</ul>|<span id=\\\"((?!Examples|Comparison_with_TCP.2FIP_model|See_also|References|External_links).*?)\\\">");
Matcher matcher = pattern.matcher(response);
ArrayList<String> content = new ArrayList<>();
content.add("OSI Model");
while (matcher.find()){
String s = matcher.group();
s = s.replaceAll("</li>\\n<li>", "\n");
s = s.replaceAll("<p>|</p>|<b>|</b>|<i>|</i>|<ul>|</ul>|<li>|</li>|\\\">", "");
s = s.replaceAll("\\u00e9", "e");
s = s.replaceAll("\\u2013|\\u2014", " - ");
s = s.replaceAll("_|\\n", " ");
s = s.replaceAll("\\\"", "\"");
content.add(s);
}
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,content){
@Override
public View getView(int position, View convertView, ViewGroup parent){
TextView item = (TextView) super.getView(position,convertView,parent);
String itemText = super.getItem(position);
if (itemText.matches("<span id=\\\".+")){
System.out.println("A");
item.setTextColor(Color.parseColor("#FF9933"));
item.setTypeface(item.getTypeface(), Typeface.BOLD_ITALIC);
item.setTextSize(TypedValue.COMPLEX_UNIT_DIP,20);
item.setText(itemText.replaceAll("<span id=\\\"", ""));
}
return item;
}
};
listView.setAdapter(arrayAdapter);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {}
});
queue.add(stringRequest);
}
}
您的manifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
你的正则表达式是错误的,我建议你使用这个regex-tool看看你做错了什么。
我对您的正则表达式进行了更改,我看到了类似这样的内容:
我改变的是:
if (itemText.matches("<span id=\".+")){
但是如果你这样保留它,你会在滚动时遇到问题,所以你必须做一些棘手的事情。随意修改
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,content){
@Override
public View getView(int position, View convertView, ViewGroup parent){
TextView item = (TextView) super.getView(position,convertView,parent);
String itemText = super.getItem(position);
if (itemText.matches("<span id=\".+")){
item.setTextColor(Color.parseColor("#FF9933"));
item.setTypeface(item.getTypeface(), Typeface.BOLD_ITALIC);
item.setTextSize(TypedValue.COMPLEX_UNIT_DIP,20);
item.setText(itemText.replaceAll("<span id=\\\"", ""));
}
else{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
item.setTextColor(getColor(android.R.color.primary_text_light));
}
item.setTypeface(null,Typeface.NORMAL);
item.setTextSize(14);
item.setText(itemText.replaceAll("<span id=\\\"", ""));
}
return item;
}