Vivek Singh
Vivek Singh

Reputation: 53

how to call adapter method from other async class

how to call refresh method of adapter from Async class,

I want to do some stuff in method refreshlikes() of adapter, so i have to call this method from Async class. so how to get running object of adapter and then call method of adapter.

    public class HomeAdapter extends RecyclerView.Adapter<HomeRowHolder> implements
        OnClickListener {
    ArrayList<PostModel> postlist = new ArrayList<PostModel>();
    Context context;
    HomeAdapter adapter;
    FragmentManager mFragmentManager;
    HomeRowHolder myhomeRowHolder;

    public HomeAdapter(FragmentManager mFragmentManager,
            ArrayList<PostModel> postlist, Context c) {
        this.postlist = postlist;
        this.context = c;
        this.mFragmentManager = mFragmentManager;
        Log.e("mFragmentManager", "" + mFragmentManager);
        // TODO Auto-generated constructor stub
    }

    @Override
    public HomeRowHolder onCreateViewHolder(ViewGroup viewGroup, int arg1) {
        // TODO Auto-generated method stub
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(
                R.layout.post_layout, null);

        HomeRowHolder mh = new HomeRowHolder(v);

        return mh;
    }

    @Override
    public int getItemCount() {
        // TODO Auto-generated method stub
        return (null != postlist ? postlist.size() : 0);
    }

    @Override
    public void onBindViewHolder(HomeRowHolder homerowholder, int i) {
        // TODO Auto-generated method stub
        PostModel postmodel = postlist.get(i);

        homerowholder.likes.setText(postmodel.getLikes());
        homerowholder.dislikes.setText(postmodel.getDislikes());
        homerowholder.comments.setText(postmodel.getComment());
        homerowholder.time.setText(postmodel.getTime());
        homerowholder.post.setText(postmodel.getPost());
        setlisteners(homerowholder, i);


    }

    private void setlisteners(final HomeRowHolder homerowholder,
            final int position) {
        // TODO Auto-generated method stub
        homerowholder.likes.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
//              (HomeAdapter)context;
                new GetLikesTask(mFragmentManager, context, homerowholder,
                        position).execute();
                //getdata().execute()
            }
        });
        homerowholder.dislikes.setOnClickListener(this);
        homerowholder.comments.setOnClickListener(this);
        homerowholder.post.setOnClickListener(this);

    }

    @SuppressLint("NewApi")
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        if (v.getId() == R.id.like_image) {

        }
        if (v.getId() == R.id.report_image) {

        }
        if (v.getId() == R.id.comment_image) {

        }
        if (v.getId() == R.id.post) {
            Log.e("activiyty exist in home adapter", ""
                    + !new AllPostActivity().isDestroyed());
            ((AllPostActivity) context).pushFragment(new SinglePostFragment());
        }
    }
    public void refreshlikes() {
//      "here i will notify this"
    }



public class GetLikesTask extends AsyncTask<String, Void, String> {

Context c;
HomeRowHolder homerowholder;
FragmentManager fragmentmanger;
public GetLikesTask(FragmentManager fragmentmanger,Context c,HomeRowHolder homerowholder, int position ) {
    // TODO Auto-generated constructor stub
    this.fragmentmanger=fragmentmanger;
    this.c=c;
    this.homerowholder=homerowholder;
}
    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub

        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        homerowholder.likes.setText("212");
        ((HomeAdapter) ).refreshlikes();`
}

Upvotes: 1

Views: 1363

Answers (1)

markView
markView

Reputation: 333

You can pass the callback throw to the AsyncTask constructor and run the method of this callback in onPostExecute().

Example code of the callback:

public interface IRefreshCallback {

    void onRefreshAdapter();
}`

Code to initialize your AsyncTask should look like this:

new GetLikesTaskfragmentmanger, context, homerowholder, position, 
new IContactCallback(){

       @Override
        void onRefreshAdapter(){
           //Or other method 
           adapter.refresh();
        }
});

And your AsyncTask should look something like this:

public class GetLikesTask extends AsyncTask<String, Void, String> {

IRefreshCallback callback;
Context c;
HomeRowHolder homerowholder;
FragmentManager fragmentmanger;
public GetLikesTask(FragmentManager fragmentmanger,Context c,HomeRowHolder homerowholder, int position, IRefreshCallback callback ) {
    // TODO Auto-generated constructor stub

    this.callback = callback
    this.fragmentmanger=fragmentmanger;
    this.c=c;
    this.homerowholder=homerowholder;
}
    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub

        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        homerowholder.likes.setText("212");
        ((HomeAdapter) ).refreshlikes();`

        this.callback.refresh();
}

In the same way you can also pass results from your AsyncTask to the rowHolders. There is no need to pass whole objects like FragmentManager or HomeRowHolder to an AsyncTask.

Upvotes: 3

Related Questions