2017-01-10 6 views
0

Возможно ли вернуть peepWithPics после отправки его в мой XMLPullParserHandler, чтобы я мог вызвать его onCreate и установить его в адаптер listView. Я не уверен, как передать его любому другому методу или классу для нас. Вызов listViewAdapter работает в этом методе, но я не могу заставить setOnItemClickLIstener работать так, чтобы думать, могу ли я создать адаптер в onCreate, а затем setOnItemCLickLister, должен помочь мне со мной двигаться вперед с моей разработкой.return response to use onCreate и почему enqueue не выполняется асинхронно

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

android.view.ViewRootImpl $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может коснуться его представлений. Эта ошибка в строке кода

listView.setAdapter(adapter); 

Весь метод состоит в

public void getXMLData() { 
     OkHttpClient client = getUnsafeOkHttpClient(); 
     Request request = new Request.Builder() 
       .url(myURL) 
       .build(); 
     client.newCall(request).enqueue(new Callback() { 
      // android.os.Handler mainHanlder = new android.os.Handler(context.getMainLooper()); 

      @Override 
      public void onFailure(Call call, IOException e) { 
       e.printStackTrace(); 
      } 

      @Override 
      public void onResponse(Call call, Response response) throws IOException { 
       final String responseData = response.body().string(); 
       final InputStream stream = new ByteArrayInputStream(responseData.getBytes()); 

       /*mainHanlder.post(new Runnable() { 

        @Override 
        public void run() {*/ 
       ArrayList<PeepWithPic> peepWithPics; 
       XMLPullParserHandler parserHandler = new XMLPullParserHandler(); 
       peepWithPics = (ArrayList<PeepWithPic>) parserHandler.parse(stream); 
         /*ListViewAdapter adapter = new ListViewAdapter(getApplicationContext(), peepWithPics); 
         listView.setAdapter(adapter); 
         listView.setVisibility(View.VISIBLE); 
         mProgressBar.setVisibility(View.GONE);*/ 
        /*} 
       });*/ 
      } 
     }); 
    } 

Я попытался добавить после mProgressBar установлен Унесенные.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
            @Override 
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
             Toast.makeText(getApplicationContext(), "WORKS FROM RUNONUI", Toast.LENGTH_LONG).show(); 
            } 

Я также попытался же setOnItemClickListener в OnCreate метод

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     context = getApplicationContext(); 
     listView = (ListView) findViewById(R.id.contactListView); 
     mProgressBar = (ProgressBar) findViewById(R.id.progressBar); 
     mProgressBar.setVisibility(View.VISIBLE); 
     getXMLData(); 
    } 

Метод getXMLData вызывается в OnCreate

+1

Возможный дубликат [обратных вызовов ответа Okhttp в основной теме] (http://stackoverflow.com/questions/24246783/okhttp-response-callbacks-on-the-main-thread) –

+0

Когда я пытаюсь выполнить любое из этих предложений из этого сообщения setOnItemClickListeners не работают при вызове из нового Runnable, runOnUI или onCreate. Я все еще не вижу, как передать peepWihtPics в onCreate, поэтому я могу попробовать и установить listView и адаптер там, а не на том, что runnable в onResponse –

+0

вы можете обновить свой вопрос тем, что вы пробовали, а также где ваш вызов getXMLData() ? –

ответ

1

Решение должно быть простым, как с помощью runOnUiThread своей деятельности (в Runnable) Метод, также я бы создал Адаптер и установил его перед вызовом getXMLData():

Добавить в список как ваша переменная активность

List<PeepWithPic> mPeepWithPics = new ArrayList<PeepWithPic>(); 
ListViewAdapter mAdapter; 

Затем инициализировать адаптер в OnCreate():

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     context = getApplicationContext(); 
     listView = (ListView) findViewById(R.id.contactListView); 
     mProgressBar = (ProgressBar) findViewById(R.id.progressBar); 
     mProgressBar.setVisibility(View.VISIBLE); 
     mAdapter = new ListViewAdapter(this, mPeepWithPics); 
     listView.setAdapter(mAdapter); 
     /* THIS DOES NOT WORK WHEN YOU HAVE A CLICKABLE VIEW IN A CUSTOM ADAPTER 
     listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       Toast.makeText(getApplicationContext(), "WORKS FROM RUNONUI", Toast.LENGTH_LONG).show(); 
      } 
     }); */ 
     getXMLData(); 
    } 

Затем измените метод:

public void getXMLData() { 
    OkHttpClient client = getUnsafeOkHttpClient(); 
    Request request = new Request.Builder() 
      .url(myURL) 
      .build(); 
    client.newCall(request).enqueue(new Callback() { 

     @Override 
     public void onFailure(Call call, IOException e) { 
      e.printStackTrace(); 
     } 

     @Override 
     public void onResponse(Call call, Response response) throws IOException { 
      final String responseData = response.body().string(); 
      final InputStream stream = new ByteArrayInputStream(responseData.getBytes()); 
      XMLPullParserHandler parserHandler = new XMLPullParserHandler(); 
      final ArrayList<PeepWithPic> peepWithPics = (ArrayList<PeepWithPic>) parserHandler.parse(stream); 
      mPeepWithPics.clear(); 
      mPeepWithPics.addAll(peepWithPics); 

      /* Now tell the adapter on the UI thread its data changed*/ 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        mAdapter.notifyDataSetChanged(); 
        listView.setVisibility(View.VISIBLE); 
        mProgressBar.setVisibility(View.GONE); 
       } 
      }); 
     } 
    }); 
} 

UPDATE

Для обработки щелчка, у вас есть добавить OnItemClickListener в свой Adpater в корневой макет так как ваш адаптер является обычным, а в представлении содержится интерактивный виджет.

Удачи и счастливой кодировки!

+0

Я обновил свой код, как указано выше, но я столкнулся с этой ошибкой на mAdapter = new, ....Я получаю ошибку: (57, 49) error: несовместимые типы: Список не может быть преобразован в ArrayList

+0

in onResponse я обновляю тип, попробуйте сейчас –

+0

Итак, код запускается снова, но я все еще сталкиваюсь с проблемой не возможность вызова setOnItemClickListener. Я попытался вызвать его на runOnUiThread и после того, как адаптер установлен onCreate. Я просто пытаюсь показать тост, чтобы убедиться, что он работает и ничего. –

 Смежные вопросы

  • Нет связанных вопросов^_^