Reputation: 815
I want to start a new activity from this base adapter.
public class EfficientAdapter extends BaseAdapter {
private Activity activity;
private ArrayList<ComptePost> data;
private static LayoutInflater inflater = null;
public ImageLoader imageLoader;
public Boolean isActusAstuce;
public static int flag = 0, counter=0;
private Context context;
public EfficientAdapter(Context context) {
this.context = context;
}
NVirementEmmeteur main;
int num = 0;
ViewHolder holder;
static String src;
public EfficientAdapter(Activity a, ArrayList<ComptePost> d) {
activity = a;
data = d;
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// imageLoader = new ImageLoader(activity.getApplicationContext());
imageLoader=new ImageLoader(activity.getApplicationContext());
}
public EfficientAdapter(NVirementEmmeteur m) {
main = m;
}
@Override
public int getCount() {
return data.toArray().length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
public static class ViewHolder {
public TextView one;
public TextView two;
public TextView three;
public ImageView image;
public RelativeLayout relative_layout;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View vi = convertView;
holder.relative_layout.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
v.getContext().startActivity(new Intent(context, NVirementEmmeteur.class));
}
});
return vi;
}
}
I tried
context.startActivity(new Intent(context, NVirementEmmeteur.class));
and
v.getContext().startActivity(new Intent(context, NVirementEmmeteur.class));
but it force closes my application.
The intent should launch inside an onclicklistener()
from the list adapter. Can someone tell me how to launch an intent from my efficientadapter.class please.
Here is my logcat output:
04-11 10:07:50.878: E/AndroidRuntime(11179): FATAL EXCEPTION: main 04-11 10:07:50.878: E/AndroidRuntime(11179): java.lang.NullPointerException 04-11 10:07:50.878: E/AndroidRuntime(11179): at android.content.ComponentName.(ComponentName.java:75) 04-11 10:07:50.878: E/AndroidRuntime(11179): at android.content.Intent.(Intent.java:2863) 04-11 10:07:50.878: E/AndroidRuntime(11179): at.adapter.EfficientAdapter$1.onClick(EfficientAdapter.java:141) 04-11 10:07:50.878: E/AndroidRuntime(11179): at android.view.View.performClick(View.java:2538) 04-11 10:07:50.878: E/AndroidRuntime(11179): at android.view.View$PerformClick.run(View.java:9152) 04-11 10:07:50.878: E/AndroidRuntime(11179): at android.os.Handler.handleCallback(Handler.java:587) 04-11 10:07:50.878: E/AndroidRuntime(11179): at android.os.Handler.dispatchMessage(Handler.java:92) 04-11 10:07:50.878: E/AndroidRuntime(11179): at android.os.Looper.loop(Looper.java:130) 04-11 10:07:50.878: E/AndroidRuntime(11179): at android.app.ActivityThread.main(ActivityThread.java:3687) 04-11 10:07:50.878: E/AndroidRuntime(11179): at java.lang.reflect.Method.invokeNative(Native Method) 04-11 10:07:50.878: E/AndroidRuntime(11179): at java.lang.reflect.Method.invoke(Method.java:507) 04-11 10:07:50.878: E/AndroidRuntime(11179): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 04-11 10:07:50.878: E/AndroidRuntime(11179): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 04-11 10:07:50.878: E/AndroidRuntime(11179): at dalvik.system.NativeStart.main(Native Method)
Upvotes: 20
Views: 87069
Reputation: 369
Java: Intent in Adapter
Intent intent = new Intent(context, MainActivity.class);
intent.putExtra("position", position);
context.startActivity(intent);
Accessing Intent Value
Bundle extras = getIntent().getExtras();
position = (getIntent().hasExtra("position") && extras != null) ? extras.getInt("position") : 0;
Kotlin: Intent in Adapter
val context = holder.itemView.context
val intent = Intent(context, MainActivity::class.java)
intent.putExtra("title", holder.button.text.toString())
context.startActivity(intent)
Accessing Intent Value in Kotlin
val letterId = intent?.extras?.getString("letter").toString()
Upvotes: 1
Reputation: 93
you can simply get the context from View v or any other created views inside the adapter class using getContext().
// TODO Auto-generated method stub
v.getContext().startActivity(new Intent(v.getContext(), NVirementEmmeteur.class));
Upvotes: 2
Reputation: 31
Replace onClick method with this it may work I didn't tried:
@Override
public void onClick(View v) {
v.getContext().startActivity(new Intent(v.getContext(), NVirementEmmeteur.class));
}
Upvotes: 3
Reputation: 375
I faced this problem previously and tried all of the suggestions above, but the only one helped me to start an activity from an adopter was the solution proposed by @Md. Sajedul Karim.
I modified the code and used like this
Intent intent = new Intent(context, NesneTani.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
Upvotes: 9
Reputation: 7075
Pass Context via Constructor and then just use this line of code:
Intent intent=new Intent(context.getApplicationContext(), YourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
context.getApplicationContext().startActivity(intent);
Thanks :)
Upvotes: 2
Reputation: 934
set clickListener on listview in mainactivity from there start the intent
lv.setAdapter(adapter);
lv.setOnItemClickListener(new OnItemClickListener()
{
@Override public void onItemClick(AdapterView<?> arg0, View arg1,int position, long arg3)
{
Intent intent = new Intent(getActivity,Test.class);
startActivity(intent);
}
});
Upvotes: 0
Reputation: 18978
you have passed context of activity in constructor so you can also use;
activity.startActivity(new Intent(activity, NVirementEmmeteur.class));
check here is sample code you get idea what to do:
setadapter like : adapter = new MyArrayAdapter(MainActivity.this, COUNTRIES);
adapter code:
package com.example.testapp;
import com.example.main.util.testActivity;
import android.content.Context;
import android.content.Intent;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
class MyArrayAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private Context mcon;
private String[] COUNTRIES_;
public MyArrayAdapter(Context con, String[] countries) {
// TODO Auto-generated constructor stub
mcon = con;
COUNTRIES_ = countries;
mInflater = LayoutInflater.from(con);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return COUNTRIES_.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
final ListContent holder;
View v = convertView;
if (v == null) {
v = mInflater.inflate(R.layout.my_spinner_style, null);
holder = new ListContent();
holder.line = (LinearLayout) v.findViewById(R.id.line_);
holder.name = (TextView) v.findViewById(R.id.textView1);
holder.name1 = (TextView) v.findViewById(R.id.textView2);
holder.name2 = (ImageView) v.findViewById(R.id.imageView1);
v.setTag(holder);
} else {
holder = (ListContent) v.getTag();
}
holder.name.setText("" + Html.fromHtml("" + COUNTRIES_[position]));
holder.name1.setText("" + Html.fromHtml("" + COUNTRIES_[position]));
holder.line.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mcon.startActivity(new Intent(mcon, testActivity.class));
}
});
return v;
}
}
class ListContent {
TextView name;
TextView name1;
ImageView name2;
LinearLayout line;
}
Edited:
if your are use this constructor: then list.setadapter(new EfficientAdapter(myactivity.this));
public EfficientAdapter(Context context) {
this.context = context;
}
then use : context.startActivity(new Intent(context, NVirementEmmeteur.class));
if you use this construdtor list.setadapter(new EfficientAdapter(myactivity.this, ComptePostarray));
public EfficientAdapter(Activity a, ArrayList<ComptePost> d) {
activity = a;
data = d;
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// imageLoader = new ImageLoader(activity.getApplicationContext());
imageLoader=new ImageLoader(activity.getApplicationContext());
}
then use activity.startActivity(new Intent(activity, NVirementEmmeteur.class));
Hope you understud....
Upvotes: 27
Reputation: 3485
also you can do like, Here mContext
is Your BaseAdpter
Context
Object
Intent ieventreport = new Intent(mContext,Your.class);
mContext.startActivity(ieventreport);
change your Constructer like, initialise
public EfficientAdapter(Context context, ArrayList<ComptePost> d){
}
Upvotes: 8
Reputation: 10969
Pass activity context from activity and use same context while calling Intent.
From activity:
yourview.setAdapter(new EfficientAdapter(this));
within adapter:
private Context mContext;
public EfficientAdapter(Context c) {
mContext = c;
}
Now use mContext
to call Intent.
startActivity(new Intent(mContext, NVirementEmmeteur.class));
Upvotes: 0
Reputation: 10083
Set an intent for the class u need to open.In manifest file . Eg:
<activity android:name=".openingclass"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.OPEN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Then
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i=new Intent("android.intent.action.OPEN");
StartActivity(i);
}
Upvotes: 1