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()看起来是错误的;以这种方式声明它给了我一个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());
    }
}