【问题标题】:How to Call AsyncTask from Adapter class?如何从适配器类调用 AsyncTask?
【发布时间】:2015-08-18 09:43:41
【问题描述】:

我有GetMembersAsyncTask 的活动课。我也有一个带有 DeleteAsynccTask 的适配器类。当我单击列表视图项目中的取消图像时,DeleteAsynccTask 将调用。如果该项目成功删除,那么我将在DeleteAsynccTask 中的OnPostExecute() 方法中调用GetMemberAsynacTask

public class AddmemberSearch extends Activity {
private ListViewAdapter listviewAdapter;
protected void onCreate(Bundle savedInstanceState)
 {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.family_search_members);
    ButterKnife.inject(this);
    new GetFamilyListAsynctask().execute();
 }
class GetMembersAsyncTask extends AsyncTask<String, String, String> {
    protected void OnPreExecute(){}
    protected String doInBackground(String... params) { 
        some code here
    }
    protected void onPostExecute(String file_url) { }
}
}

现在ListViewAdapter类是这样的。

public class ListViewAdapter extends BaseAdapter {
Activity context;    
private ImageButton cancel_img;
SharedPreferences sharedPrefUser;
public ListViewAdapter(Activity context, ArrayList<familiesListBO> data) {
    super();
    this.context = context;
    this.data = data;
}
@Override
public int getCount() {
    return data.size();
}
@Override
public Object getItem(int position) {
    return position;
}
@Override
public long getItemId(int position) {
    return position;
}
private class ViewHolder {
    TextView txtViewMember; 
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder holder;
    LayoutInflater inflater = context.getLayoutInflater();
    FamiliesListBO familiesListBO;
    familiesListBO = data.get(position);
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.added_member_listview, null);
        holder = new ViewHolder();
        holder.txtViewMember = (TextView) convertView.findViewById(R.id.txt_addedmember_names);            
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }        
    if (familiesListBO.getName() != null) {
        holder.txtViewMember.setText(familiesListBO.getName());
        familiesListBO.getName();
    }
    cancel_img = (ImageButton) convertView.findViewById(R.id.cancel_row_img);
    cancel_img.setTag(holder);
    cancel_img.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            new DeleteAsynccTask().execute();
        }
    });
    return convertView;
}

class DeleteAsynccTask extends AsyncTask<String, String, String> {
    ResultVO getDeletionsResponse;
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }
    @Override
    protected String doInBackground(String... params) {
         try {                
            getDeletionsResponse = services.delete("this is delete code");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    @Override
    protected void onPostExecute(String s) {
        int appStatusCode = getDeletionsResponse.getAppStatusCode();
        if (appStatusCode == Constants.APP_STATUS_CODE_SUCCESS) {
            ExceptionMessages.showAlertDialog(context, IFamilyUtil.FAMILY_DELETE_SUCCESS_TITLE, IFamilyUtil.FAMILY_DELETE_SUCCESS_MESSAGE, true);
            new AddmemberSearch.GetMembersAsyncTask().execute();
        } else {
            ExceptionMessages.showAlertDialog(context, IFamilyUtil.FAMILY_DELETE_FAIL_TITLE, IFamilyUtil.FAMILY_DELETE_FAIL_MESSAGE, true);
        }
        notifyDataSetChanged();           
    }
}
}

这里如何从适配器类调用GetMemberAsynctask

【问题讨论】:

  • 您可以将您的适配器类移动到您的活动类中,并将适配器类作为内部类。因此您可以访问在适配器中调用 GetMemberAsynctask
  • 这种方法太牛了...

标签: android listview android-adapter


【解决方案1】:

您可以将您的适配器类移动到您的活动类中,并将适配器类作为内部类。因此您可以像这样在适配器中调用 GetMemberAsynctask:

public class AddmemberSearch extends Activity {
private ListViewAdapter listviewAdapter;
protected void onCreate(Bundle savedInstanceState)
 {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.family_search_members);
    ButterKnife.inject(this);
    new GetFamilyListAsynctask().execute();
 }

public class ListViewAdapter extends BaseAdapter {
Activity context;    
private ImageButton cancel_img;
SharedPreferences sharedPrefUser;
public ListViewAdapter(Activity context, ArrayList<familiesListBO> data) {
    super();
    this.context = context;
    this.data = data;
}
@Override
public int getCount() {
    return data.size();
}
@Override
public Object getItem(int position) {
    return position;
}
@Override
public long getItemId(int position) {
    return position;
}
private class ViewHolder {
    TextView txtViewMember; 
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder holder;
    LayoutInflater inflater = context.getLayoutInflater();
    FamiliesListBO familiesListBO;
    familiesListBO = data.get(position);
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.added_member_listview, null);
        holder = new ViewHolder();
        holder.txtViewMember = (TextView) convertView.findViewById(R.id.txt_addedmember_names);            
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }        
    if (familiesListBO.getName() != null) {
        holder.txtViewMember.setText(familiesListBO.getName());
        familiesListBO.getName();
    }
    cancel_img = (ImageButton) convertView.findViewById(R.id.cancel_row_img);
    cancel_img.setTag(holder);
    cancel_img.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            new DeleteAsynccTask().execute();
        }
    });
    return convertView;
}

class DeleteAsynccTask extends AsyncTask<String, String, String> {
    ResultVO getDeletionsResponse;
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }
    @Override
    protected String doInBackground(String... params) {
         try {                
            getDeletionsResponse = services.delete("this is delete code");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    @Override
    protected void onPostExecute(String s) {
        int appStatusCode = getDeletionsResponse.getAppStatusCode();
        if (appStatusCode == Constants.APP_STATUS_CODE_SUCCESS) {
            ExceptionMessages.showAlertDialog(context, IFamilyUtil.FAMILY_DELETE_SUCCESS_TITLE, IFamilyUtil.FAMILY_DELETE_SUCCESS_MESSAGE, true);
            new AddmemberSearch.GetMembersAsyncTask().execute();
        } else {
            ExceptionMessages.showAlertDialog(context, IFamilyUtil.FAMILY_DELETE_FAIL_TITLE, IFamilyUtil.FAMILY_DELETE_FAIL_MESSAGE, true);
        }
        notifyDataSetChanged();           
    }
}

class GetMembersAsyncTask extends AsyncTask<String, String, String> {
    protected void OnPreExecute(){}
    protected String doInBackground(String... params) { 
        some code here
    }
    protected void onPostExecute(String file_url) { }
}

希望对你有帮助!

【讨论】:

    【解决方案2】:

    从 AddmemberSearch 类中删除 GetMembersAsyncTask 内部类

    将 GetMembersAsyncTask 作为一个单独的类(放在你的包中)

    之后,您可以像这样调用“new GetFamilyListAsynctask().execute();”从任何地方。

    【讨论】:

      【解决方案3】:

      只需将 ListViewAdapter 放入 AddMemberSearch

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-15
        • 1970-01-01
        相关资源
        最近更新 更多