1

我试图在我的活动中多次调用 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}); 再次重复吗?

4

1 回答 1

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

}
于 2013-05-15T14:19:12.467 回答