[英]Starting an Activity from an Adapter
我正在开发一个当用户从回收者视图中进行选择时从服务器下载数据的应用程序。 我已经在Main Activity的Async Task中下载并解析了数据。 这可以正常工作,但是下载完成后,我想启动一个新活动以显示下载的数据,这就是我的问题所在。
public GetItems(String username, Context context, Activity activity) {
this.username = username;
this.context = context;
this.activity = activity;
}
上面是我的异步任务的构造函数。 我正在从我的回收站OnClicklistener
传递这些值。
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
try {
//This is where the error lays
activity.startActivity( new Intent(activity,BasketActivity.class));
}
} catch (Exception e) {
Log.e(tag,e.toString());
}
问题就在这里,我曾尝试过类似问题的许多不同答案,但都无济于事。 目前,我收到以下错误
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'java.lang.String android.content.Context.getPackageName()'
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(mContext,holder.basketName.getText().toString(),Toast.LENGTH_SHORT).show();
setBasketName(holder.basketName.getText().toString());
MainActivity Activity = new MainActivity();
mainActivity.new GetBasketItems(getUsername(),getImei(),getBasketName(),mContext,mActivity).execute();
}
});
上面是我的OnClickListener
,将值传递给Async Task,尝试使用上下文和活动,每次都获取NullPointerException
。
改变这个
activity.startActivity(new Intent(activity,BasketActivity.class));
至
context .startActivity( new Intent(context,BasketActivity.class));
或在适配器中创建异步任务。
最好的方法是使用回调而不在构造函数上传递活动。
您可以简单地创建一个接口,例如:
public interface OnNextActivityListener {
public void nextActivityClickEvent();
}
该回调应该是构造函数Adapter上的一个参数,当您单击itemView时,它应类似于:
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
callback.nextActivityClickEvent();
}
});
在您的活动中实现您的界面:
public class YourActivity extends ActionBarActivity implements OnNextActivityListener {
....
//don't forget to add on your adapter constructor "this" as a parameter
@Override
public void nextActivityClickEvent(String url) {
activity.startActivity( new Intent(YourActivity.this,BasketActivity.class));
}
}
这是处理适配器内部操作的最佳实践。
尝试以下操作:创建一个如下所示的接口:
public interface SuccessfulDownloadListener {
void navigateToNewActivity(PfizerMessage message);
}
实现活动的接口,并在Activity类中为此接口创建一个对象:
//declare the variable
private SuccessfulDownloadListener downloadListner;
//initialize the variable in onCreate()
downloadListner = new SuccessfulDownloadListener();
@Override
void navigateToNewActivity(PfizerMessage message){
startActivity( new Intent(this, BasketActivity.class));
}
将此接口对象传递给Adapter构造函数:
new RecyclerAdapter(..other parameters.., this)
您的适配器将是
//declare the variable
private SuccessfulDownloadListener downloadListner;
//constructor
RecyclerAdapter(..other parameters.., SuccessfulDownloadListener downloadlistener){
this.downloadListner = downloadListner;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
try {
//This is where the error lays
downloadListner.navigateToNewActivity();
} catch (Exception e) {
Log.e(tag,e.toString());
}
}
您会得到一个空指针异常,因为在Android中您不应该保留对活动的引用,而活动可能随时被系统破坏。 要完成您正在尝试的工作,您应该首先阅读有关AsyncTask及其使用方法的信息。 了解之后,您只需实例化一个实例并从MyActivity中执行它:
new DownloadFilesTask().execute();
一旦执行,您将流回到执行后的流程:
protected void onPostExecute(Long result) {
nowShowDownloadedData();
}
并且调用nowShowDownloadedData()返回到您的原始活动,因此此时您可以以常规方式打开新活动,并将该活动作为上下文传递。
注意:异步任务在调用者活动中定义为私有类,因此它可以访问它。
尝试添加标志
Intent in=new Intent(context,NextActivity.class);
in.addFlags(FLAG_ACTIVITY_NEW_TASK);
context.startActivity(in);
希望这会起作用
尝试以下
Intent intent=new Intent(holder.itemView.getContext(),NewActivity.class);
holder.itemView.getContext().startActivity(intent);
Crete适配器可使用getter和setter保留解析的数据
public class DataAdapter implements Serializable { }
并将数据添加到适配器
List<DataAdapter> adpter= new ArrayList<DataAdapter>();
adpter.add(new Thumbnail(name, mobile));
使用Bundle将列表传递到下一个活动
Intent intent = new Intent(getApplicationContext(),NewClass.class);
Bundle bundle = new Bundle();
bundle.putSerializable("values", adpter);
context.startActivity(intent);
在下一个活动中接收列表
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
List<DataAdapter> Data = (List<DataAdapter>)bundle.getSerializable("values");
尝试这种方式
public class MyAdapter extends Adapter {
private Context context;
public MyAdapter(Context context) {
this.context = context;
}
public View getView(...){
View v;
v.setOnClickListener(new OnClickListener() {
void onClick() {
Intent intent= new Intent(context, goto.class);
intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
intent.putextra("your_extra","your_class_value");
context.startActivity(intent);
}
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.