Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.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
Android ListView适配器-更改适配器后SetOnItemClickListener失败_Android_Android Listview_Android Adapter - Fatal编程技术网

Android ListView适配器-更改适配器后SetOnItemClickListener失败

Android ListView适配器-更改适配器后SetOnItemClickListener失败,android,android-listview,android-adapter,Android,Android Listview,Android Adapter,我有一个由适配器控制的ListView。这个适配器负责动态加载内容并填充ListView。第一次填充ListView时,每当我单击一个项目时,就会调用onItemClick方法。但是,一旦我对适配器进行了更改(向下滚动,这会迫使适配器加载更多数据并将其添加到ListView),就不会调用onItemClick方法 以下是相关代码: public class RingtonesListActivity extends Activity { private ArrayList<Cat

我有一个由适配器控制的ListView。这个适配器负责动态加载内容并填充ListView。第一次填充ListView时,每当我单击一个项目时,就会调用
onItemClick
方法。但是,一旦我对适配器进行了更改(向下滚动,这会迫使适配器加载更多数据并将其添加到ListView),就不会调用
onItemClick
方法

以下是相关代码:

public class RingtonesListActivity extends Activity {

    private ArrayList<Category> categories;

    ListView myListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);

        this.categories = getIntent().getParcelableArrayListExtra("categories");

        myListView = (ListView) findViewById(R.id.listView);
        myListView.setAdapter(new MyAdapter(this, categories));

        // click in ringtone
        myListView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> arg0, View view, int i,
                    long arg3) {

                Intent intent = new Intent(view.getContext(), NewActivity.class);
                intent.putExtra("resource", (Resource) myListView.getItemAtPosition(i));

                startActivity(intent);        
            }
        });

    }
}
公共类RingtonesListActivity扩展活动{
私有数组列表类别;
列表视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_列表);
this.categories=getIntent();
myListView=(ListView)findViewById(R.id.ListView);
setAdapter(新的MyAdapter(this,categories));
//点击铃声
myListView.setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView arg0、视图、int i、,
长arg3){
Intent Intent=newintent(view.getContext(),NewActivity.class);
intent.putExtra(“资源”,(资源)myListView.getItemAtPosition(i));
星触觉(意向);
}
});
}
}
在我的适配器中:

public class MyAdapter extends BaseAdapter {
    private List<Resources> resources;
    ...

    @Override
    public int getCount() {
    return resources.size();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup arg2) {

            if (position >= getCount() - 1) {
                    // do some stuff that adds entries to the resources List
                    notifyDataSetChanged();
            }
            TextView tv = new TextView(this.context);
            tv.setText(resources.get(position).getName());
            return tv;
    }
公共类MyAdapter扩展了BaseAdapter{
私人名单资源;
...
@凌驾
public int getCount(){
返回resources.size();
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组arg2){
如果(位置>=getCount()-1){
//做一些事情,将条目添加到资源列表中
notifyDataSetChanged();
}
TextView tv=新的TextView(this.context);
tv.setText(resources.get(position.getName());
返回电视;
}

在获取视图时更改数据对我来说似乎有点奇怪。正确的方法是什么?我真的不知道。我认为getView方法永远不会在适配器列表之外的位置传递。任何时候,当您在列表中显示更多数据时,都应该调用NotifyDatasetChanged()。如果可以看到更多的行,则看起来您正在执行此操作。@t我的列表的内容是由多个XML文件生成的。我希望避免下载所有XML文件,除非我必须下载,因此我的代码只下载并解析第一个,只有当用户向下滚动时,我才会下载并解析第二个,依此类推。我找到的解决方案是到,一旦
position==getCount()-1
(最后一个元素),我就开始下载下一个XML。这是一个糟糕的方法吗?不,这是一个非常好的方法。在这里调用notifyDataSetChanged()在getView内部,我认为它看起来很时髦。模型和视图在那里会合,您应该尝试将其分离出来。您的滚动应该发生在其他地方,这是您下载新数据的地方,如果成功,请使用notifyDataSetChanged()