Android: как передать объект из одного действия в другое в методе onClick и использовать его для класса AsyncTask - PullRequest
1 голос
/ 27 марта 2012

У меня есть проблема, которую немного сложно объяснить. Я строю приложение для Android для планирования поездки. У меня есть основной вид деятельности, который содержит элемент карты и некоторые другие кнопки и класс AsyncTask, где осуществляется связь с сервером, и путь отображается на карте. Я пытаюсь заставить его работать в автономном режиме, сохраняя ответ от сервера в базе данных sqllite.

У меня есть действие под названием MainActivity. Там у меня есть метод для пунктов меню

public boolean onOptionsItemSelected(final MenuItem pItem) {        
    switch (pItem.getItemId()) {
    case R.id.recent_trips:
            startActivity(new Intent(this, recentTripsActivity.class));
            break;
    default:
             break;
        }

        return false;
    }
}

Вот текущий метод вызова класса AsyncTask

btnPlanTrip.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
      tripReq = new TripRequest(MainActivity.this,activityHandler,db);
    tripReq.execute(request);
    }
     });
}

Когда я нажимаю на элемент Recent_trips в меню, открывается недавняя функция Trips. По сути, в этом классе я извлекаю некоторые данные из базы данных mysqllite и представляю их в listView через адаптер. Там у меня есть метод view.setOnClickListener, в котором при нажатии на элемент списка я принимаю определенное значение (res = listItem.getofflineResult ();). Я хотел бы использовать это значение в основной активности (подробнее см. Ниже). Вот код.

public class recentTripsActivity extends Activity implements Serializable {
    private ImageButton stopSearch;
    private AutoCompleteTextView searchField;
    SQLiteDatabase db;
    OfflineTripRequest tripReq;
    String res;
    //db = openOrCreateDatabase("AndroidDatabase.db", SQLiteDatabase.CREATE_IF_NECESSARY, null);


     private ListView listview;
     private ArrayList mListItem;
     ItemBO listItem;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            setContentView(R.layout.recent_trips); 

            //open database connection
            db = openOrCreateDatabase("AndroidDatabase.db", SQLiteDatabase.CREATE_IF_NECESSARY, null);
            int i=0;
            String [] str={"id","description","offlineResult"};
            listview = (ListView) findViewById(R.id.lview_trips);

            mListItem = new ArrayList<ItemBO>();

            Cursor cursor = db.query("tbl_offlinePathResult",str, null, null, null, null, null);

            cursor.moveToFirst();
            while (!cursor.isAfterLast()) {
                i++;
                ItemBO listItem = new ItemBO(i,cursor.getString(1),cursor.getString(2));
                mListItem.add(listItem);
                cursor.moveToNext();
                if(i==10){
                    break;
                }
            }
            // Make sure to close the cursor
            cursor.close();
            i++;

            listview.setAdapter(new ListAdapter(recentTripsActivity.this, R.id.lview_trips,mListItem));
            db.close();
    }


//***ListAdapter***
 class ListAdapter extends ArrayAdapter { //--CloneChangeRequired
    private ArrayList mList; //--CloneChangeRequired
    private Context mContext;

    @SuppressWarnings("unchecked")
    public ListAdapter(Context context, int textViewResourceId,
            ArrayList list) { //--CloneChangeRequired
        super(context, textViewResourceId, list);
        this.mList = list;
        this.mContext = context;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        try {
            if (view == null) {
                LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                view = vi.inflate(R.layout.list_item_saved_paths, null); //--CloneChangeRequired(list_item)
            }
            final ItemBO listItem = (ItemBO) mList.get(position); //--CloneChangeRequired
            if (listItem != null) {
                // setting list_item views
                ((TextView) view.findViewById(R.id.tv_name))
                        .setText(listItem.getDescription());

                view.setOnClickListener(new OnClickListener() {
                    public void onClick(View arg0) { //--clickOnListItem
                         res=listItem.getofflineResult(); 

                    }
                });
            }
        } catch (Exception e) {
            Log.i(recentTripsActivity.ListAdapter.class.toString(), e.getMessage());
        }
        return view;
    }
 }
}

Я хотел бы передать упомянутые выше данные (res = listItem.getofflineResult () в MainActivity. После этого я хотел бы вызвать класс AsyncTask и передать эти данные этому классу. Как можно Я делаю все это, нажимая на listItem? Как я уже говорил, карта находится в MainActivity, но щелчок будет происходить из другого действия. Я надеюсь, что я достаточно ясно выразился, если у вас есть какие-либо вопросы, пожалуйста, спросите меня

Ответы [ 3 ]

1 голос
/ 27 марта 2012

Ну, вы можете передать res (String?) Разными способами, простыми являются настройки броска:

SharedPreferences settings = context.getSharedPreferences(APPNAME, 0);
SharedPreferences.Editor editor = settings.edit();
    editor.putString("res", res);
    editor.commit();

и затем в MainActiviy получите:

SharedPreferences settings = context.getSharedPreferences(APPNAME, 0);
res = settings.getString("res","");

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

public abstract Global{
 public static String res;
}

, и вы можете получить доступ к любой деятельности, как:

Global.res = "A"
1 голос
/ 27 марта 2012

Во-первых, вам нужно переопределить onListItemClick в вашем списке.Затем вам нужно будет поместить необходимую информацию в пакет и завершить действие.Этот пакет «возвращается» к вызывающему действию в методе onActivityReuslt этого действия (которое вам нужно будет переопределить).См .:

Передача данных между действиями

1 голос
/ 27 марта 2012

Я обычно использую одноэлементный метод при передаче данных в приложении для Android. Если вы незнакомы, это в основном статический класс, который всегда возвращает один и тот же экземпляр. Это позволяет создавать несколько «экземпляров» класса, которые совместно используют одни и те же данные.

Шаблон синглтон-дизайна

...