Android ListView适配器-更改适配器后SetOnItemClickListener失败
我有一个由适配器控制的ListView。这个适配器负责动态加载内容并填充ListView。第一次填充ListView时,每当我单击一个项目时,就会调用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
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()