2013-12-17 2 views
0

В моем приложении Android у меня есть активность, которая создает ListView. ListView содержит несколько элементов. Каждый элемент связан с определенным условием. Если условие выполнено, элемент должен быть включен и доступен для кликов. В противном случае элемент должен быть отключен и не доступен для кликов. Чтобы постоянно проверять условия, у меня есть отдельный поток, который проверяет условие для каждого элемента и соответственно обновляет представление элемента. Мой код работает без ошибок, но поведение элемента не достигает моей потребности. Иногда элемент остается не кликабельным, даже если его условие выполнено. Иногда элементы можно щелкнуть, даже если условие не выполнено. Иногда элементы ведут себя правильно. Поэтому я считаю, что я осуществляю его ненадлежащим образом, что вызывает такое недетерминированное поведение.Включение и отключение элемента списка ListView

Ниже часть моей деятельности:

menu = new ArrayList<String>(); 

//menu 
//Critical Features 
menu.add("View Patient Records"); 
menu.add("Search in File"); 
menu.add("Search Medicine"); 
menu.add("Search by Date"); 
menu.add("Search by Illness"); 
menu.add("Report"); 

//Important Features 
menu.add("Identify Nearest Emergency"); 
menu.add("Identify District Emergency"); 

menu.add("Planning Intervention"); 
menu.add("Real-time Assistance"); 

//Useful Features 
listView = (ListView) findViewById(R.id.listView1); 
listView.setClickable(true); 



    ArrayAdapter<String> arrayAdapter =  
      new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, menu); 
      listView.setAdapter(arrayAdapter); 


      listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 


       public void onItemClick(AdapterView <? > arg0, View view, int position, long id) { 
        // When clicked, show a toast with the TextView text 

Ниже часть нити проверки условий и обновления вид:

  if(! condition) 

       {    
       mainActivity.getListView().post(new Runnable() 
        {  
         public void run() 
         { 
           View v = mainActivity.getListView().getChildAt(2); 
           v.setEnabled(false); 
           v.setOnClickListener(null);    
         } 
        }); 

        } 


      if(condition) 
      { 


     mainActivity.getListView().post(new Runnable() 
        {  
         public void run() 
         { 
           View v = mainActivity.getListView().getChildAt(2); 
           v.setEnabled(true); 

         } 
        }); 

     } 

Примечание: состояние, связанное с элементом зависит от батареи, скорости сети, сетевого типа ..... и т. д. Таким образом, состояние изменяется неопределенно, и представление может постоянно меняться.

+0

Вы уверены, что вам действительно нужна эта дополнительная тема? Вам нужен пользовательский адаптер и работайте с его методом 'isEnabled()'. – Luksprog

+0

Если другое решение, кроме потока, может удовлетворить мою потребность, я бы пошел с ним. Не могли бы вы рассказать? –

+0

Эти условия меняются где-то еще за короткие промежутки времени? Или вы просто используете поток для изменения представлений по мере прокрутки пользователя? Если это более поздний случай, тогда вам это действительно не нужно, вам просто нужно реализовать очень простой пользовательский адаптер. – Luksprog

ответ

0

Это звучит так, как будто это связано с видом просмотра в виде списка андроидов.

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

1

Попробуйте использовать scrolllistener.

listview.setOnScrollListener(new OnScrollListener(){ 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
     // TODO Auto-generated method stub 
    } 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     // TODO Auto-generated method stub 
if(! condition) 

       {    
       mainActivity.getListView().post(new Runnable() 
        {  
         public void run() 
         { 
           View v = mainActivity.getListView().getChildAt(2); 
           v.setEnabled(false); 
           v.setOnClickListener(null);    
         } 
        }); 

        } 


      if(condition) 
      { 


     mainActivity.getListView().post(new Runnable() 
        {  
         public void run() 
         { 
           View v = mainActivity.getListView().getChildAt(2); 
           v.setEnabled(true); 

         } 
        }); 

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