使用AsyncTask中的onPostExecute方法列表项单击事件调用Android中的另一个活动
我正在从事一个项目,该项目为列表视图填充SQLite数据库表,并使用简单的数组适配器 我正在使用Asyntask进行此操作,但在以下情况下出现问题:使用AsyncTask中的onPostExecute方法列表项单击事件调用Android中的另一个活动,android,android-intent,android-asynctask,android-context,Android,Android Intent,Android Asynctask,Android Context,我正在从事一个项目,该项目为列表视图填充SQLite数据库表,并使用简单的数组适配器 我正在使用Asyntask进行此操作,但在以下情况下出现问题: 我想呼叫另一个活动和 传递我从setOnItemClickListener获取的一些值 我需要将这两件事归档到onPostExecutesetOnItemClickListener方法中。这是我的代码 package com.me.doctor.doctor_me; import android.app.Activ
setOnItemClickListener获取的一些值
onPostExecute
setOnItemClickListener
方法中。这是我的代码
package com.me.doctor.doctor_me;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
public class BackgroundTask extends AsyncTask<String,Doctor,String> {
Context ctx;
DoctorAdapter doctorAdapter;
Activity activity;
ListView listView;
Doctor doctor;
DisplayDoctor displayDoctor;
BackgroundTask(Context ctx){
this.ctx = ctx;
activity = (Activity) ctx;
doctor = new Doctor();
displayDoctor = new DisplayDoctor();
}
@Override
protected String doInBackground(String... strings) {
String method = strings[0];
DatabaseOperation databaseOperation = new DatabaseOperation(ctx);
if(method.equals("get_info")){
listView = activity.findViewById(R.id.display_list_view);
SQLiteDatabase db = databaseOperation.getReadableDatabase();
Cursor cursor = databaseOperation.getInformation(db);
doctorAdapter = new DoctorAdapter(ctx,R.layout.display_doctor_row);
String name, category, hospital;
int id;
while(cursor.moveToNext()){
id = cursor.getInt(cursor.getColumnIndex("d_id"));
name = cursor.getString(cursor.getColumnIndex("d_name"));
category = cursor.getString(cursor.getColumnIndex("d_category"));
hospital = cursor.getString(cursor.getColumnIndex("d_hospital"));
Doctor doctor = new Doctor(id,name,category,hospital);
publishProgress(doctor);
}
return "get_info";
}
return null;
}
@Override
protected void onProgressUpdate(Doctor... values) {
// add each of doctor class object add method inside the adapter class
doctorAdapter.add(values[0]);
}
@Override
protected void onPostExecute(String s) {
if(s.equals("get_info")){
listView.setAdapter(doctorAdapter);
listView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
final int position, long id) {
Doctor doctor = (Doctor)parent.getItemAtPosition(position);
String ID = Integer.toString(doctor.getId());
Toast.makeText(ctx,ID,Toast.LENGTH_LONG).show();
// I need fire another activity and pass some values which i getting here
}
});
}else{
Toast.makeText(ctx,s,Toast.LENGTH_LONG).show();
}
}
}
我已经调查了关于堆栈溢出的封闭式问题,但没有找到解决方案。简短回答:
您在后台任务中已经有上下文
Context-ctx代码>
使用此按钮调用下一个Activity
ctx.startActivity(nextActivityContent)
你可以像这样给意图添加值
Intent-nextractivityintent=新的Intent(ctx,nextractivity.class);
nextActivityIntent.putExtra(“数据”、“某些数据”)代码>
使用异步任务,我猜您正在尝试在另一个线程上查询数据库
您可以使用装载机进行同样的操作
加载程序在单独的线程上运行
下面是游标加载器的一个简单示例
从
公共类ForecastFragment扩展片段实现LoaderManager.LoaderCallbacks{
public static final int LOADER_ID = 0;
private ArrayAdapter<String> forecastAdapter;
private ForecastAdapter mForecastAdapter;
public ForecastFragment() { }
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
getLoaderManager().initLoader(LOADER_ID, null, this);
super.onActivityCreated(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
return rootView;
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
//some database query
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
//some action
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
publicstaticfinalint-LOADER\u ID=0;
专用阵列适配器forecastAdapter;
私人预测适配器mForecastAdapter;
公共预测片段(){}
@凌驾
ActivityCreated上的公共无效(@Nullable Bundle savedinStateCState){
getLoaderManager().initLoader(LOADER_ID,null,this);
super.onActivityCreated(savedInstanceState);
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图根视图=充气机。充气(R.layout.fragment_main,容器,错误);
返回rootView;
}
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
//一些数据库查询
}
@凌驾
public void onLoadFinished(加载器、光标数据){
//一些行动
}
@凌驾
公共void onLoaderReset(加载器){
}
}为什么不能在活动中调用setonimclickliester
?你是说DisplayDoctor活动?那么,那个时候该方法会给我从这个列表视图中想要的信息吗?是的,我的意思是DisplayDoctor
classit就这么简单:,~20行代码基本上你使用了错误的适配器:使用[simple]CursorAdapter
如果你的数据模型是基于sqlite的,我可以放置这个startActivity()setOnItemClickListener方法中的方法?@SahanPasinduNirmal是的,你可以
public static final int LOADER_ID = 0;
private ArrayAdapter<String> forecastAdapter;
private ForecastAdapter mForecastAdapter;
public ForecastFragment() { }
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
getLoaderManager().initLoader(LOADER_ID, null, this);
super.onActivityCreated(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
return rootView;
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
//some database query
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
//some action
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}