public class MainActivity extends AppCompatActivity {
@BindView(R.id.recyclerView) RecyclerView recyclerView;
AdapterMainActivity adapterMainActivity;
List<Music> listAdapters = new ArrayList<Music>();
OkHttpClient okHttpClient;
String SEARCH_KEYWORD = "";
@BindView(R.id.progressLoader) ProgressBar progressLoader;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
adapterMainActivity = new AdapterMainActivity(this, listAdapters);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapterMainActivity);
okHttpClient = new OkHttpClient();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.m_main_activity, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (newText.length() >= 5) {
SEARCH_KEYWORD = newText;
adapterMainActivity.clear();
new Async().execute();
} else {
if (newText.length() < 5) {
adapterMainActivity.clear();
}
}
return false;
}
});
return true;
}
//**********************************Class Loader PlayList**********************************
class Async extends AsyncTask {
GsonMainActivity gsonMainActivity;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressLoader.setVisibility(View.VISIBLE);
}
@Override
protected Object doInBackground(Object[] objects) {
Request request = new Request.Builder()
.url("https://itunes.apple.com/search?term=" + SEARCH_KEYWORD)
.build();
try {
Response response = okHttpClient.newCall(request).execute();
gsonMainActivity = new GsonBuilder()
.create()
.fromJson(response.body().string(), GsonMainActivity.class);
} catch (IOException e) {
e.printStackTrace();
}
listAdapters.clear();
for (int i = 0; i < gsonMainActivity.results.size(); i++) {
Music music = new Music(
gsonMainActivity.results.get(i).artistName,
gsonMainActivity.results.get(i).trackName,
gsonMainActivity.results.get(i).artworkUrl100,
gsonMainActivity.results.get(i).previewUrl
);
listAdapters.add(music);
}
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
adapterMainActivity.notifyItemRangeInserted(0, listAdapters.size());
progressLoader.setVisibility(View.INVISIBLE);
}
}
}
clear Adapter
public void clear(){
int size = this.listMusic.size();
this.listMusic.clear();
notifyItemRangeRemoved(0, size);
}
Когда я пишу в search слово по буквам с паузой в 3 сек. То все работает хорошо. Но если начинаю писать сразу без остановки то вываливается ошибка
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{527536ac position=40 id=-1, oldPos=0, pLpos:0 scrap [attachedScrap] tmpDetached not recyclable(1) no parent}
Я понимаю что проблема кроется в asyncTask, хотя ошибка в RecyclerView происходит, но я думаю если решить проблему с AsyncTask то и в RecyclerView все отлично будет. Было бы не плохо понять как вырубить поток asyncTask, даже если он выполняется.
Или же лучше будет сделать мне некий таймер типо если я не пишу в течении 1 сек. То тогда запускается AsyncTask? А если человек опять писать начнет, а AsyncTask выполняется. Думаю правильнее будет вырубить asyncTask Если пользователь начал что - то писать.
Подскажите как это сделать и правильно ли я мыслю?
Подскажите пожалуйста пытаюсь с ЯндексПереводчика получать список поддерживаемых языковСам ответ с сервера приходит в таком виде:
Есть скомпилированное java приложение без исходных кодовТребуется изменить реакцию программы на движение колёсиком мыши
Пишу небольшое клиент-серверное приложение с использованием сокетовПоявился вопрос