简体   繁体   English

从另一个活动更新 TextView

[英]Updating TextView from another Activity

I have an Adapter (A ViewHolder) Class, and when a Button is pressed I'd like to update a TextView of the Home() activity, preferrably without launching the activity immediatly.我有一个 Adapter (A ViewHolder) 类,当按下 Button 时,我想更新 Home() 活动的 TextView,最好不要立即启动该活动。

The code in the Adapter:适配器中的代码:

public class GameViewAdapter extends RecyclerView.Adapter<GameViewAdapter.GameViewHolder> {
public static Object OnItemClickListener;
private ArrayList<GameItem> mGameList;
private OnItemClickListener mListener;
public static MyCallback callback;


public GameViewAdapter(ArrayList<GameItem> mGameList, GameViewAdapter.OnItemClickListener mListener, MyCallback callback) {
    this.mGameList = mGameList;
    this.mListener = mListener;
    this.callback = callback;
}

@Override
public GameViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    Context context = viewGroup.getContext();
    View v = LayoutInflater.from(context).inflate(R.layout.game_entry, viewGroup, false);
    GameViewHolder GVH = new GameViewHolder(v, mListener);
    return GVH;
}

@Override
public void onBindViewHolder(@NonNull GameViewHolder gameViewHolder, int position) {
    gameViewHolder.bind(mGameList.get(position));
}

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

class GameViewHolder extends RecyclerView.ViewHolder {

    private ImageView itemCover;
    private TextView itemTitle;
    private TextView itemDescription;
    private PopupWindow popupWindow;
    private ImageView popUpImage;
    private TextView PopUpTitle;
    private EditText customAmount;
    private Button add;
    private Button addcustom;
    private Button exit;

    public GameViewHolder(View itemView, GameViewAdapter.OnItemClickListener mListener) {
        super(itemView);
        setupViews(itemView);
    }

    public void bind(final GameItem gameItem) {
        Glide.with(this.itemCover).load(gameItem.getCover()).into(this.itemCover);
        this.itemTitle.setText(gameItem.getTitle());
        this.itemDescription.setText(gameItem.getDescription());
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showPopUp(itemView, gameItem);
            }
        });
    }

    private void setupViews(View itemView) {
        addcustom = itemView.findViewById(R.id.addcustom);
        popUpImage = itemView.findViewById(R.id.popupimg);
        PopUpTitle = itemView.findViewById(R.id.popuptitle);
        customAmount = itemView.findViewById(R.id.gameamount);
        itemCover = itemView.findViewById(R.id.GameCover);
        itemTitle = itemView.findViewById(R.id.GameTitle);
        itemDescription = itemView.findViewById(R.id.GameAmount);
        exit = itemView.findViewById(R.id.exit);
    }

    private void showPopUp(final View itemView, final GameItem gameItem) {
        //Declaration
        final View popupView = LayoutInflater.from(itemView.getContext()).inflate(R.layout.popup, null);
        final PopupWindow popupWindow = new PopupWindow(popupView, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT);
        final ImageView popupItemCover = popupView.findViewById(R.id.popupimg);
        final TextView popupItemTitle = popupView.findViewById(R.id.popuptitle);
        //Set Data
        Glide.with(popupItemCover).load(gameItem.getCover()).into(popupItemCover);
        popupItemTitle.setText(gameItem.getTitle());
        popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0);

        //ExitButton
        exit = popupView.findViewById(R.id.exit);
        exit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popupWindow.dismiss();
            }
        });

        add = popupView.findViewById(R.id.addaverage);
        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                callback.onDataChanged(Integer.valueOf(gameItem.getTime()));
                Toast.makeText(popupView.getContext(), String.valueOf(gameItem.getTime()), Toast.LENGTH_SHORT).show();
            }
        });
    }

}

public interface MyCallback {
    void onDataChanged(Integer gameTime);
}

public interface OnItemClickListener {
    void onGameClick(int position);
}
}

And I have implemented this in the Main Activity:我已经在主要活动中实现了这一点:

   public void onDataChanged(int gameTime) {
    // it will fire when you call your callback.onDataChanged(); in your adapter
    // here can change your textview
    GameTime.setText(Integer.valueOf(gameTime));
}

} }

I've tried to use BroadcastReceiver as well, with no success.我也尝试使用 BroadcastReceiver,但没有成功。

Thank you!谢谢!

EDIT:编辑:

When adding the callback my App crashes with following traceback:添加回调时,我的应用程序因以下回溯而崩溃:

java.lang.NullPointerException: Attempt to invoke interface method 'void com.reogen.gametime.Adapters.GameViewAdapter$MyCallback.onDataChanged(java.lang.String)' on a null object reference
    at com.reogen.gametime.Adapters.GameViewAdapter$GameViewHolder$3.onClick(GameViewAdapter.java:127)

Line 127 is: callback.onDataChanged(Integer.valueOf(gameItem.getTime()));第 127 行是: callback.onDataChanged(Integer.valueOf(gameItem.getTime()));

You can create observable like:您可以创建可观察对象,例如:

in your Adapter create:在您的适配器中创建:

public interface IMyCallback {
    void onDataChanged(int gameTime);
}

Global field in Adapter:适配器中的全局字段:

private IMyCallback callback

Inside constructor of Adapter Adapter 的内部构造函数

public MyAdapter(... , IMyCallback callback) {
    ...
    this.callback = callback;
}

Now your activity make implements IMyCallback and override method onDataChanged.现在您的活动 make 实现了 IMyCallback 并覆盖了 onDataChanged 方法。 And when you create your adapter send as callback YourActivity.this .当您创建适配器时,将其作为回调发送YourActivity.this

finnaly you need to make like:最后你需要像这样:

    add.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    callback.onDataChanged(Integer.valueOf(gameItem.getTime()));
                }

after this call you will get update in your override method onDataChanged in your activity class.在此调用之后,您将在您的活动类中的 onDataChanged 覆盖方法中获得更新。 enjoy请享用

------------ Update ----------- in your activity, when you will implements interface you will get method like ------------ 更新 ----------- 在您的活动中,当您实现接口时,您将获得类似的方法

     @Override
    public void onDataChanged(int gameTime) {
        // it will fire when you call your callback.onDataChanged(); in your adapter
        // here can change your textview
        textview.setText(String.valueOf(gameTime));
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM