Java 从适配器启动活动
我正在开发一个应用程序,当用户从回收器视图中进行选择时,它可以从服务器下载数据。我已经在主活动的异步任务中下载并解析了数据。这很好,但下载完成后,我想开始一个新的活动来显示下载的数据,这就是我的问题所在Java 从适配器启动活动,java,android,android-recyclerview,nullpointerexception,Java,Android,Android Recyclerview,Nullpointerexception,我正在开发一个应用程序,当用户从回收器视图中进行选择时,它可以从服务器下载数据。我已经在主活动的异步任务中下载并解析了数据。这很好,但下载完成后,我想开始一个新的活动来显示下载的数据,这就是我的问题所在 public GetItems(String username, Context context, Activity activity) { this.username = username; this.context = context; this.activity =
public GetItems(String username, Context context, Activity activity) {
this.username = username;
this.context = context;
this.activity = activity;
}
上面是异步任务的构造函数。我正在从我的recyclerview的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()”
上面是我的
OnClickListener
我将值传递给异步任务,我尝试使用上下文和活动,每次都会得到NullPointerException
。你会得到一个空指针异常,因为在Android中,你不应该保持对活动的引用,任何时候都可能被系统摧毁。
要想完成你正在尝试的事情,你应该首先阅读并了解如何使用它。一旦理解,您只需实例化一个并从MyActivity执行它:
new DownloadFilesTask().execute();
一旦执行,您将在执行后将流程返回到您的:
protected void onPostExecute(Long result) {
nowShowDownloadedData();
}
调用nowShowDownloadedData()将返回到原始活动,因此此时您可以按常规方式打开新活动,将此活动作为上下文传递
注意:异步任务在调用方活动中定义为私有类,因此它可以访问它。更改此设置
activity.startActivity(新意图(activity,BasketActivity.class))
到
或者在适配器中创建异步任务。尝试添加标志
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);
使用getter和setter保存解析数据的克里特适配器
public class DataAdapter implements Serializable { }
并将数据添加到adpter
List<DataAdapter> adpter= new ArrayList<DataAdapter>();
adpter.add(new Thumbnail(name, mobile));
在下一个活动中接收列表
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
List<DataAdapter> Data = (List<DataAdapter>)bundle.getSerializable("values");
Intent-Intent=getIntent();
Bundle=intent.getExtras();
列表数据=(列表)bundle.getSerializable(“值”);
最好的方法是使用回调,而不是在构造函数上传递活动
您只需创建如下界面:
public interface OnNextActivityListener {
public void nextActivityClickEvent();
}
此回调应该是构造函数适配器上的一个参数,当您单击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 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);
}
});
}
}
试试这个:
创建一个如下所示的界面:
public interface SuccessfulDownloadListener {
void navigateToNewActivity(PfizerMessage message);
}
实现活动的接口,并在活动类中创建此接口的对象:
//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));
}
将此接口对象传递给适配器构造函数:
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());
}
}
MainActivity活动=新的MainActivity()如果是ActivityActivity=new MainActivity(),则代码>看起来是错误的;以这种方式声明它给了我一个java.lang.NullPointerException:尝试对空对象引用错误调用虚拟方法“java.lang.String android.content.Context.getPackageName()”,但您没有执行new MainActivity()代码>如果是活动。为什么要执行mainActivity.new GetBasketItems(getUsername()、getImei()、getBasketName()、mContext、mActivity).execute()代码>实现这一点的最佳方法是通过接口。将接口从适配器传递并实现其方法到activity类。@Demonic218为什么要启动另一个activity?我的意思是,你所描述的是相当普遍的,所以我会这样面对:如果你下载的数据与你的recyclerView项目相同,只需刷新它们。如果不同,一个选项是立即进入新页面,让用户在那里等待,例如在微调器前面。如果这两个建议都不适用于您,则将activity.class字符串传递给异步任务,并将新活动的启动与意图进行通信,这就是在Android中启动新活动的方式。private void showdownloadedata(){startActivity(new intent(main activity.this,BasketOrderActivity.class));}
尝试这种方法会给我一个java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String android.content.Context.getPackageName()”
为什么创建新的Intent()时会传递MainActivity.this?请尝试传递此代码,因为该代码应该在活动本身中执行。也许值得明确指出:在我的示例中,nowShowDownloadedData()应该是MainActivity的私有方法。activity应该是MainActivity=newmainActivity()?java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String android.content.Context.getPackageName()”-在此attemptcontext.startActivity(新意图(Context,BasketActivity.class));
//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));
}
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());
}
}