从适配器到意图

Posted

技术标签:

【中文标题】从适配器到意图【英文标题】:From Adapter into Intent 【发布时间】:2021-10-28 00:00:52 【问题描述】:

我有一个用于 ListView 的适配器。该列表中的每个项目都有一个按钮,当用户按下该按钮时,它将进入另一个活动,其中包含有关该特定项目信息的信息(信息来自它的关联对象)。

我怎样才能做到这一点,当我按下按钮时,我将创建一个新的 Intent 对象,将 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;
    

【问题讨论】:

你可以通过 2 种方式做到这一点,1)使用上下文对象调用 startActivity 方法像这样context.startActivity(intent); 2)你可以使用 callback 概念的帮助下界面。 【参考方案1】:

startActivity(intent) 不是免费的,你需要一个上下文。您可以在普通活动类中调用 startActivity(intent),因为它内置了上下文变量。因为您创建了一个新类 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);

【讨论】:

我实际上将 this.context = context 放在了超级 bcs 下,否则它并没有让我这样做,但是是的,它起作用了!非常感谢! @qwirrr 我的错误,感谢您的纠正,我已经编辑了。无论如何,因为您的类继承了 ArrayAdapter 类,其中包含上下文,您可以直接调用 getContext().startActivity(yourIntent) 而无需创建新的实例变量。

以上是关于从适配器到意图的主要内容,如果未能解决你的问题,请参考以下文章

从列表视图的自定义适配器内的意图服务接收结果

在 MVVM 的适配器中启动意图是一个好习惯吗?

通过分享意图分享图像到 Whatsapp

当意图传递给其他活动时,为啥从 parcelable 中得到错误的值?

我如何使用意图从列表视图转到下一个活动? [复制]

例外:从意图存储ArrayList时“无法转换为java.util.ArrayList”