Reputation: 53
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
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