Вызов другого действия в Android с помощью события щелчка элемента списка методов метода onPostExecute в AsyncTask - PullRequest
0 голосов
/ 05 октября 2018

Я работаю над проектом, который заполняет таблицу базы данных SQLite для просмотра списка и использует простой адаптер массива.

Я использую Asyntask для этой цели, и у меня возникают проблемы, когда:

  1. Я хочу вызвать другое действие и
  2. передать некоторые значения, которые я получаю из 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();
                }

            }

        }

И это класс, который вызывает класс AsyncTask

            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 Ответ

0 голосов
/ 05 октября 2018

Краткий ответ: у вас уже есть контекст в Фоновом задании Context ctx;

Используйте это, чтобы вызвать следующую активность ctx.startActivity(nextActivityIntent)

Вы можете добавить значения в намерение, как это Intent nextActivityIntent = new Intent(ctx,NextActivity.class); nextActivityIntent.putExtra("data", "some data");

с асинхронной задачей. Я предполагаю, что вы пытаетесь запросить базу данных в другом потоке. Вы можете использовать загрузчики для одного и того же Загрузчики, запущенные в отдельном потоке

Вот простой пример загрузчика курсора

пример взят из github

открытый класс ForecastFragment расширяет Fragment реализует 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) {

}

}

...