Дождитесь ответа залпа, затем обновите ListView - PullRequest
0 голосов
/ 19 октября 2018

Я хочу вывести данные из API MediaWiki, проанализировать их, затем поместить заголовки и абзацы в просмотр списка.В приведенном ниже коде я создаю и устанавливаю адаптер внутри метода onResponse запроса, потому что если я сделаю это снаружи, запрос еще не будет завершен.

Я также переопределяю метод getView адаптера, потому что хочу отформатировать элементы, например полужирные и цветные заголовки.Я проверил это в другом проекте, и он работает, но когда он помещен в метод onResponse, этот раздел больше не имеет никакого эффекта.

Решение, которое я имею в виду, - это ожидание залпа для завершения запроса перед установкойlistview в основной ветке.Я читал решения об использовании фьючерсов и асинхронной задачи, но это не сработало для меня, и я не совсем понимаю, достаточно, чтобы попытаться это исправить.Кто-нибудь может помочь?

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);
    }
}

1 Ответ

0 голосов
/ 19 октября 2018

Вам не хватает этого в вашем manifest.xml

<uses-permission android:name="android.permission.INTERNET"/>

Ваше регулярное выражение неверно, я рекомендую вам использовать этот инструмент регулярных выражений , чтобы увидеть, что вы делаете неправильно.

Я внес изменения в ваше регулярное выражение и вижу что-то вроде этого:

enter image description here

Я изменил следующее:

 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;
                                }
...