Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对同一活动多次调用OnItemClick方法:_Java_Android_Android Listview_Onitemclicklistener - Fatal编程技术网

Java 对同一活动多次调用OnItemClick方法:

Java 对同一活动多次调用OnItemClick方法:,java,android,android-listview,onitemclicklistener,Java,Android,Android Listview,Onitemclicklistener,我尝试在我的活动中多次调用onItemClick方法,每次单击listVew中的某个项目时,其内容都会发生变化,当我再次单击新内容中的某个项目时,我需要再次调用该方法, 他是我的密码: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lesCat=new

我尝试在我的活动中多次调用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);

                }
            });
        }
    }
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lesCat=newarraylist();
CG=新类别测试();
//获取所有类别
lesCat=GC.GetAllCategories();
lvListe=(ListView)findViewById(R.id.listView1);
//在listView中显示根类别
adapter=newcategoriesadapter(this,CG.getRootCategories(lesCat));
lvListe.setAdapter(适配器);
lvListe.setOnItemClickListener(this);
}
public void onItemClick(AdapterView父对象、视图、整型位置、长id)
{
CG=新类别gest();
//如果单击的“分类”具有子类别,则将显示它们
//以新的视角
if(CG.hasChild(lesCat.get(position)))
{
lv=新列表视图(本);
lesCat1=CG.getChilds(lesCat,lesCat.get(position));
CategoriesAdapter=新的CategoriesAdapter(这是lesCat1);
低压设置适配器(适配器);
setContentView(lv);
lv.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
lesCat2=CG.getChilds(lesCat,lesCat1.get(position));
CategoriesAdapter=新的CategoriesAdapter(MainActivity.this,lesCat2);
低压设置适配器(适配器);
setContentView(lv);
}
});
}
}
有没有更好的办法? 如果我需要调用onItemClick方法两次以上,我需要重复吗
lv.setOnItemClickListener(新的OnItemClickListener(){//code})

再次

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

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

您还只需要设置一次单击处理程序

请参见此示例:

更新: 新信息后的修订。

你最初的问题是“有更好的方法吗?”所以这是我的观点

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

实际上,单击类别时所做的是放弃当前的listview和适配器,创建新的listview和适配器,然后替换视图树,这样可以更有效地重用已有的对象

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

这不是一个完整的示例,但它说明了要点

//假设您有一个名为CatAdapter的自定义Listadapter,它返回“Category”视图
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getListView().setOnItemClickListener(新的AdapterView.OnItemClickListener()){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
CategoryItem ci=((CategoryItem)getListAdapter()).getItem(position);//获取单击的类别
刷新数据(ci.getCategoryID);
}
});
RefreshData(0);//根类别
}
//使用类别列表更新listview
公共无效刷新数据(int ParentCategoryID){
ArrayList items=Category.GetItem(ParentCategoryID);
CatAdapter adp=(CatAdapter)getListAdapter();
//您可能需要在适配器上实现这些方法
adp.Clear();//清除旧类别
adp.AddAll(items);//向适配器添加新项
adp.notifyDataSetChanged();//刷新UI
}

您在这里真正想要实现的目标是什么。为什么每次单击列表中的项目时都要创建新的滚动视图和列表视图。还有,为什么要将ListView添加到ScrollView?ListView自行处理滚动。另外,你不应该使用
getBaseContext()
使用
YourActivity。我知道内容每次都会发生变化,我需要这样做,这是一个类别及其子类别的列表,每次单击Category我都需要显示其子类别,子类别也可能有子类别…所以在布局上有多个列表视图?你现在的问题不是很清楚。显示附加到的单击处理程序代码是哪个listview?