сбой моего приложения в событии ListView или потоке

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