【问题标题】:Using Intent to send user to another activity from Adapter使用 Intent 将用户从适配器发送到另一个活动
【发布时间】:2020-08-23 08:11:55
【问题描述】:

当用户在收集位置后单击回收视图内的图片时,我试图将用户发送到另一个活动,无论我做什么,使用上下文时我仍然在适配器上显示 null 的问题,请找到下面的代码和向我描述我错过了什么?!

问题出在 onclick 方法的代码中(最后一个):-

package com.example.boc.Teachers;

import androidx.appcompat.app.AppCompatActivity;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.example.boc.R;
import com.example.boc.main.DashboardActivity;

import java.util.ArrayList;

public class TeachersAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private LayoutInflater mInflater;
    private ArrayList<TeachersModel> items;
    private TeacherMain mActivity;
    private Context context;
    public TeachersAdapter(ArrayList<TeachersModel> data, TeacherMain activity) {
        this.items = data;
        this.mActivity = activity;
        this.mInflater = LayoutInflater.from(mActivity);
    }

    public void addItem(TeachersModel result) {
        items.add(result);
    }
    public TeachersAdapter(Context context) {
        this.context = context;
    }
    public void setInflater(LayoutInflater layoutInflater){
        this.mInflater =layoutInflater;
    }

    public void replaceItems(ArrayList<TeachersModel> newItems) {
        this.items.clear();
        for(TeachersModel item: newItems)
            this.items.add(item);
    }

    public void insertItem(TeachersModel item) {
        items.add(0, item);
    }

    public void clearItems(){
        items.clear();
    }

    public void AddResults(ArrayList<TeachersModel> result) {
        items.addAll(result);
    }

    public TeachersModel getItemsAt(int position){
        return  items.get(position);
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        TeachersModel model = items.get(position);
        MessageViewHolder messageViewHolder = (MessageViewHolder) holder;
        messageViewHolder.imageViewIcon.setBackgroundResource(model.getImage());
        messageViewHolder.textViewName.setText(model.getName());
        messageViewHolder.textViewStatus.setText(model.getStatus());
        messageViewHolder.textViewMobile.setText(model.getMobile());
    }

    @Override
    public int getItemViewType(int position) {
        return  super.getItemViewType(position);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View rootCategoryView = mInflater.inflate(R.layout.row_item_teachers, parent, false);
        return new MessageViewHolder(rootCategoryView, this);
    }

    private class MessageViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private ImageView imageViewIcon;
        private TextView textViewName;
        private TextView textViewStatus;
        private TextView textViewMobile;
        private CardView cardView;

        private MessageViewHolder(View itemView, TeachersAdapter adapter) {
            super(itemView);
            imageViewIcon = (ImageView) itemView.findViewById(R.id.imageViewIcon);
            textViewName = (TextView) itemView.findViewById(R.id.textViewName);
            textViewStatus = (TextView) itemView.findViewById(R.id.textViewStatus);
            textViewMobile = (TextView) itemView.findViewById(R.id.textViewMobile);
            cardView = (CardView) itemView.findViewById(R.id.cardView);

            cardView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            final int pos = getAdapterPosition();
            if (pos == 0) {
                imageViewIcon.setOnClickListener( new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Intent intent = new Intent( context, DashboardActivity.class );
                        context.startActivity( intent );
                    }
                } );

                Toast.makeText(mActivity, "Selected Item Position "+pos, Toast.LENGTH_SHORT).show();
            }
        }
    }
}

【问题讨论】:

    标签: java android-studio android-intent android-recyclerview adapter


    【解决方案1】:

    我假设您使用的是 constrcutor 而没有传递 context

    //update the constructor to take a context
    
    public TeachersAdapter(ArrayList<TeachersModel> data, TeacherMain activity , Context context) {
    this.items = data;
    this.mActivity = activity;
    this.mInflater = LayoutInflater.from(mActivity);
    //add this
    this.context = context;
    }
    

    onBindViewHolder中设置点击监听:

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    
    ....
    ....
    ....
    
    messageViewHolder.imageViewIcon.setOnClickListener( new View.OnClickListener() {
    
    @Override
    public void onClick(View view) {
    
    Intent intent = new Intent(context, DashboardActivity.class );
    context.startActivity(intent);
    }
    });
    
    }
    

    当您在活动中创建adapter 时,请确保传递正确的context

    adapter = new TeachersAdapter(... , .... ,  getApplicationContext());
    

    【讨论】:

    • 您的答案缺少这一行:- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //添加这一行,但在我放好之后,它现在可以工作了,所以用这行更新你的答案,我已经指出它是正确的答案。
    • 这一行并不是真正需要的。
    猜你喜欢
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    相关资源
    最近更新 更多