Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Callback from Adapter

So I have a custom listview. It's like Instagram layout with 1 image and bunch of buttons in each list items. So here's the problem:

I want to implement the share button. To do this, I tried to create a callback from adapter to activity. But it didn't seem to work. Here is what I have so far(I cropped out the unrelated parts):

MainActivity

public class MainActivity extends ActionBarActivity implements ListAdapter.OnShareClickedListener{

    ListView main_list;
    List<String> url_list; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        main_list = (ListView) findViewById(R.id.listView);
        ListAdapter nListAdapter = new ListAdapter(context, url_list);
        main_list.setAdapter(nListAdapter);
    }

    @Override
    public void ShareClicked(String url) {
        Log.e("Test",url);
    }

}

ListAdapter

public class ListAdapter extends BaseAdapter implements View.OnClickListener {

    OnShareClickedListener mCallback;
    Context context;
    public static List<String> url_list;

    public ListAdapter(Context c, List<String> list) {
        this.context = c;
        url_list = list;
    }

    public interface OnShareClickedListener {
        public void ShareClicked(String url);
    }


    @Override
    public void onClick(View v) {
                mCallback.ShareClicked("Share this text.");
        }
    }

}

Error Log:

Attempt to invoke interface method 'void com.packagename.ListAdapter$OnShareClickedListener.ShareClicked(java.lang.String)' on a null object reference
like image 474
Wiillyx3 Avatar asked Mar 09 '26 10:03

Wiillyx3


1 Answers

You need to tell the adapter which implementation of the OnShareClickedListener() to use. Right now in your adapter the field mCallback is never assigned to, either you need to have a setOnSharedClickedListener() method in your adapter which you then call from your mainActivity and set it with the main activity's implementation or you need to take in the constructor.

My suggestion would be to use a setter instead of constructor. So what you need to do is this.

Your ListAdapter

public class ListAdapter extends BaseAdapter implements View.OnClickListener {

    OnShareClickedListener mCallback;
    Context context;
    public static List<String> url_list;

    public ListAdapter(Context c, List<String> list) {
        this.context = c;
        url_list = list;
    }

    public void setOnShareClickedListener(OnShareClickedListener mCallback) {
        this.mCallback = mCallback;
    }

    public interface OnShareClickedListener {
        public void ShareClicked(String url);
    }


    @Override
    public void onClick(View v) {
        mCallback.ShareClicked("Share this text.");
    }
}

Your MainActivty

public class MainActivity extends ActionBarActivity implements ListAdapter.OnShareClickedListener{

    ListView main_list;
    List<String> url_list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        main_list = (ListView) findViewById(R.id.listView);
        ListAdapter nListAdapter = new ListAdapter(this, url_list);
        nListAdapter.setOnShareClickedListener(this);
        main_list.setAdapter(nListAdapter);
    }

    @Override
    public void ShareClicked(String url) {
        Log.e("Test", url);
    }

}
like image 134
Bhargav Avatar answered Mar 10 '26 23:03

Bhargav



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!