你能帮帮我,如果有什么办法,如何从类扩展ArrayAdapter调用方法startActivityForResult(..)?
感谢。
编辑:ARRAYADAPTER的新增代码:
有MyAdapter类的代码:
public class MyAdapter extends ArrayAdapter {
public static final String bundle_text = "some_text";
public MyAdapter(Context context, int textViewResourceId, List<MyAdapterItem> data) {
super(context, textViewResourceId, data);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
// ...
row.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(getContext(), MyNewActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
int id = 1;
Bundle bundle = new Bundle();
bundle.putLong(MyAdapter.bundle_text, id);
intent.putExtras(bundle);
getContext().startActivity(intent);
}
});
return super.getView(position, convertView, parent);
}
public static final String bundle_text = "some_text";
public MyAdapter(Context context, int textViewResourceId, List<MyAdapterItem> data) {
super(context, textViewResourceId, data);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
// ...
row.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(getContext(), MyNewActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
int id = 1;
Bundle bundle = new Bundle();
bundle.putLong(MyAdapter.bundle_text, id);
intent.putExtras(bundle);
getContext().startActivity(intent);
}
});
return super.getView(position, convertView, parent);
}
一切正常,但是从ArrayAdapter类中无法调用startActivityForResult,我只能调用startActivty。 但是在MyNewActivity完成之后,我想刷新listview,但是当我无法调用startActivityForResult时我不知道如何。
答案 0 :(得分:1)
这是一个常见的误解(就像旧线程一样,我只是给出一个大纲)
适配器仅用于数据列表视图 - 它确实返回一个视图,就像在getView中一样,但是并没有真正处理任何GUI事件 - 这些都是在活动中完成的。实际上,如果适配器从Internet或数据库加载大量行,则应在UI线程外部完成。
活动是为了活动。您将单击侦听器附加到活动中的列表视图。然后调用例如没有问题详细编辑活动 - 它全部在UI线程上。因此从UI线程启动活动没有问题。
更新适配器的问题!如果从详细活动返回返回,您会发现列表未更新,因为适配器未更新。为此,请为RESULT启动详细活动。不要用任何适配器东西弄乱细节“形式”。实际上,您可以选择返回在详细记录中创建或编辑的POJO,而不必担心数据库。
现在,在您的活动中,您将监听onActivityResult()并插入适配器(如果您在应用程序中有例如SQLite,则插入数据库后端),然后通知数据已更改为列表视图。它会自动更新列表视图。
如果重新加载listview,则性能可能会成为问题。在大多数情况下,您可以通过添加到适配器并简单地通知列表视图数据进行更改。由于数据显示是“增量”,因此您可能已编辑了第1-5行的第3行。然后列表视图将只刷新那些1-5行的显示位置。但是,如果你只重新加载说500行,那么你可能会遇到性能问题:)