代码之家  ›  专栏  ›  技术社区  ›  Sahan Pasindu Nirmal

使用AsyncTask中的onPostExecute方法list item click事件调用Android中的另一个活动

  •  -2
  • Sahan Pasindu Nirmal  · 技术社区  · 7 年前

    我正在做一个项目,它为列表视图填充SQLite数据库表并使用简单的数组适配器。

    我正为此目的使用Asyntask,但遇到以下问题:

    1. 传递我从 setOnItemClickListener

    onPostExecute SetonimeClick侦听器 方法。这是我的密码。

            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();
                    }
    
                }
    
            }
    

                package com.me.doctor.doctor_me;
    
            import android.support.v7.app.AppCompatActivity;
            import android.os.Bundle;
    
            public class DisplayDoctor extends AppCompatActivity {
    
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.display_doctor_layout);
                    BackgroundTask backgroundTask = new BackgroundTask(this);
                    backgroundTask.execute("get_info");
                }
    
            }
    

    我调查了关于堆栈溢出的封闭问题,但没有找到解决方案。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Tushar Saha    7 年前

    简短回答: 你已经在后台任务中有了上下文 Context ctx;

    使用此呼叫下一个活动 ctx.startActivity(nextActivityIntent)

    你可以像这样给意图添加值 Intent nextActivityIntent = new Intent(ctx,NextActivity.class); nextActivityIntent.putExtra("data", "some data");

    使用异步任务,我猜您正在尝试查询另一个线程上的数据库 你也可以使用装载机 加载程序在单独的线程上运行

    下面是一个简单的游标加载器示例

    示例取自 github

    公共类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) {
    
    }
    

    }