不断启用和禁用ListView项目

时间:2013-12-17 16:00:13

标签: android listview android-listview clickable

在我的Android应用程序中,我有一个创建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);

                         }
                     });

        }

注意:与项目相关的条件取决于电池,网络速度,网络类型.....等。因此条件不确定地变化,视图可以不断变化。

2 个答案:

答案 0 :(得分:1)

尝试使用滚动侦听器。

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);

                         }
                     });

        }
}
}

答案 1 :(得分:0)

这听起来与android列表视图中的视图回收有关。

如果您的条件定期更新,那么您需要创建一个自定义适配器并拥有最新的引用,以便在每次从适配器中调用getView时进行检查。