Из адаптера в Намерение

#java #android #android-intent

Вопрос:

У меня есть адаптер для ListView, который у меня есть. У каждого элемента в этом списке есть кнопка, когда пользователь нажимает эту кнопку, он переходит к другому действию с информацией об этом конкретном элементе (информация получена из связанного с ним объекта).

Как я могу сделать так, чтобы при нажатии на кнопку я создавал новый объект намерения, помещал в него user.getOfferID (), а затем начинал это действие? Я пытался делать по старинке , но он не позволяет мне писать startActivity(intent); , говорит, что его не существует.

Как я могу это сделать?

Вот адаптер:

 package com.example.create4me;

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class UsersAdapter extends ArrayAdapter<UserItem> {
    public UsersAdapter(Context context, ArrayList<UserItem> users) {
        super(context, 0, users);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        UserItem user = getItem(position);
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.userlayout, parent, false);
        }
        TextView username = (TextView) convertView.findViewById(R.id.userlayoutUsername);
        TextView timestamp = (TextView) convertView.findViewById(R.id.userlayoutTimestamp);
        TextView isComplete = (TextView) convertView.findViewById(R.id.isComplete);
        Button viewPurchase = (Button) convertView.findViewById(R.id.userlayoutViewBtn);
        username.setText(user.getUsername());
        timestamp.setText(user.getTimestamp());
        isComplete.setText(user.getIsComplete());
        viewPurchase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //How can I make it so HERE I go into another acitivity that will also
                //get user.getOfferID() as a parameter?
                //The button works since the Toast is shown when I click it
                
                Toast.makeText(getContext(), "I was clicked", Toast.LENGTH_LONG).show();
            }
        });
        return convertView;
    }
}
 

Вот класс UserItem:

 package com.example.create4me;

public class UserItem {
    String username, timestamp, offerID, isComplete;
    public UserItem(String username, String timestamp, String offerID, String isComplete){
        this.username = username;
        this.timestamp = timestamp;
        this.offerID = offerID;
        this.isComplete = isComplete;
    }
    public String getUsername(){
        return this.username;
    }
    public String getTimestamp(){
        return this.timestamp;
    }
    public String getOfferID(){
        return this.offerID;
    }
    public String getIsComplete(){
        return this.isComplete;
    }
}
 

Комментарии:

1. Вы можете сделать это 2 способами: 1)Используйте объект контекста для вызова метода startActivity таким образом context.startActivity(intent); 2) Вы можете использовать концепцию обратного вызова с помощью интерфейса.

Ответ №1:

Способность к началу(намерение) не дается бесплатно, вам нужен контекст. Вы можете вызвать startActivity(намерение) внутри обычного класса активности, потому что он встроен в контекстную переменную. Поскольку вы создаете новый класс UsersAdapter, вам необходимо сохранить контекст, переданный из конструктора, создав новую переменную экземпляра.

 private Context context;
 

Затем назначьте его в конструкторе.

 public UsersAdapter(Context context, ArrayList<UserItem> users) {
    super(context, 0, users);
    this.context = context;
}
 

Теперь внутри setOnClickListener вы можете вызвать startActivity с помощью контекста, и Android Studio не покажет ошибку.

 context.startActivity(yourIntent);
 

Комментарии:

1. Я на самом деле поместил этот.контекст = контекст под super bcs, это не позволяло мне поступить иначе, но да, это сработало! Большое вам спасибо!

2. @qwirrr моя ошибка, спасибо за исправление, я отредактировал ее. В любом случае, поскольку ваш класс унаследовал класс ArrayAdapter, в котором есть контекст, вы можете напрямую вызвать getContext().startActivity(yourIntent) без создания новой переменной экземпляра.