#android #multithreading #listview
#Android #многопоточность #listview
Вопрос:
lst.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, final View view,int position, long id) {
//btnsub is button
btnsub.setEnabled(true);
Toast.makeText(getApplicationContext(), "before start()", Toast.LENGTH_SHORT).show();
for(int i=0;i<j;i ){
//lst is ListView Object
View vtmp = lst.getChildAt(i);
if(vtmp !=null){
if(i==lst.getCheckedItemPosition()){
//cindex is int var
cindex=lst.getCheckedItemPosition();
}else{ }
}
}
new Thread() {
public void run() {
Toast.makeText(getApplicationContext(), "in Thread ", Toast.LENGTH_LONG).show();
try{
Thread.sleep(1000);
lst.getChildAt(cindex).setBackgroundColor(Color.BLUE);
}catch(Exception e){
Toast.makeText(getApplicationContext(), "Thread Generate: " e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}.start();
Toast.makeText(getApplicationContext(), "after start()", Toast.LENGTH_SHORT).show();
}
});
Комментарии:
1. Тост в потоке неверен. Показать всплывающее окно в потоке пользовательского интерфейса. Также настройка цвета фона. Зачем вам вообще нужен поток?? и опубликуйте трассировку стека
2. я установил цвет фона элемента ListView непосредственно в условии if, но это не работает должным образом, поэтому я использовал любой другой вариант, а затем предложил мне…
3. Попробуйте изменить фон элемента, когда флажок определенного элемента установлен для изменения в адаптере getView (). с помощью флажка проверьте прослушиватель изменений.
4. Привет, мистер @Prasathviki, я попробовал ваше предложение вместо темы, но оно не работает должным образом
5. Мистер Хареш, я не понял вашего ответа
Ответ №1:
Вы не можете обновить пользовательский интерфейс в рабочем потоке. Измените свой код:
new Thread() {
public void run() {
try{
Thread.sleep(1000);
mActivity.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), "in Thread ", Toast.LENGTH_LONG).show();
lst.getChildAt(cindex).setBackgroundColor(Color.BLUE);
}
});
}catch(Exception e){
}
}
}.start();
Лучший способ — использовать обработчик, который вы можете прочитать — связь с потоком пользовательского интерфейса
Ответ №2:
Замените часть потока на приведенный ниже код :
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "in Thread ", Toast.LENGTH_LONG).show();
try{
Thread.sleep(1000);
lst.getChildAt(cindex).setBackgroundColor(Color.BLUE);
}catch(Exception e){
Toast.makeText(getApplicationContext(), "Thread Generate: " e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}
});