在同一个活动上多次调用OnItemClick方法:

时间:2013-05-15 14:14:54

标签: java android android-listview onitemclicklistener

我试图在我的活动上多次调用onItemClick方法,每次我点击我的listVew项目,其内容发生变化,当我再次点击新内容的项目时,我需要调用方法再次, 他是我的代码:

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    lesCat=new ArrayList<Categorie>();
    CG=new categorieGest();
            //Get all categories  
    lesCat=GC.GetAllCategories();    
    lvListe= (ListView)findViewById(R.id.listView1);
            //Display Root Categories in the listView 
    adapter = new CategoriesAdapter(this, CG.getRootCategories(lesCat));
    lvListe.setAdapter(adapter);

    lvListe.setOnItemClickListener(this);
}

    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
{

        CG=new categoriesGest();
                    //If clicked categorie has sub categories, this will display them 
                    //in a new ListeView
        if( CG.hasChild( lesCat.get(position) ) )
        {
            lv = new ListView(this);
            lesCat1=CG.getChilds(lesCat, lesCat.get(position) );
            CategoriesAdapter adapter = new CategoriesAdapter(this, lesCat1);
            lv.setAdapter(adapter);
            setContentView(lv);
            lv.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    lesCat2=CG.getChilds(lesCat, lesCat1.get(position) );
                    CategoriesAdapter adapter = new CategoriesAdapter(MainActivity.this, lesCat2);
                    lv.setAdapter(adapter);
                    setContentView(lv);

                }
            });
        }
    }

有没有更好的方法呢? 如果我需要调用onItemClick方法超过两次,我必须重复 lv.setOnItemClickListener(new OnItemClickListener() { //code});  再次

1 个答案:

答案 0 :(得分:2)

每次点击导致列表更改的项目时,您都在创建新的适配器。

设置适配器一次(在点击处理程序之外),然后处理点击。

您也只需要设置一次点击处理程序。

查看此示例: http://android-helper.blogspot.co.uk/2011/04/android-listview-onclick-ample.html

<强>更新: 新信息后的修订。

您最初的问题是“有更好的方法吗?”所以这是我的意见。

您在每次点击时重新创建列表视图和适配器的解决方案都是不必要的,并且浪费资源。在我看来,你应该有一个listview和一个适配器来完成你设置的任务。列表视图上的clickhandler也应该只设置一次。

实际上,单击某个类别时您正在执行的操作是丢弃当前列表视图和适配器,创建新视图,然后替换视图树,这样可以更有效地重用已有的对象。

当您单击listviewitem时,清除当前适配器,根据已更新的类别列表重新填充它,并在适配器上调用NotifyDatasetChanged,该适配器将使用更新的信息重新填充列表视图。

这不是一个完整的样本,但它说明了主要观点。

// Assumes that you have a Custom Listadapter named CatAdapter that returns "Category" views

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
           CategoryItem ci=((CategoryItem) getListAdapter()).getItem(position); // Get the clicked category

            RefreshData(ci.getCategoryID); 
        }
    });

    RefreshData(0); // Root Category

}

// Updates the listview with a list of categories
public void RefreshData(int ParentCategoryID) {
    ArrayList<Category> items = Category.GetItem(ParentCategoryID);

    CatAdapter adp = (CatAdapter) getListAdapter();
    // You may need to implement these methods on your adapter
    adp.Clear(); // Clear out the old categories
    adp.AddAll(items); // Add new items to the adapter
    adp.notifyDataSetChanged(); // refresh the UI

}