Обновление TextView из другого занятия - PullRequest
0 голосов
/ 03 марта 2019

У меня есть класс Adapter (A ViewHolder), и при нажатии кнопки я хотел бы обновить TextView действия Home (), желательно без немедленного запуска действия.

Код вАдаптер:

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);
}
}

И я реализовал это в основной деятельности:

   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));
}

}

Я также пытался использовать BroadcastReceiver, безуспех.

Спасибо!

РЕДАКТИРОВАТЬ:

При добавлении обратного вызова мое приложение аварийно завершается со следующей трассировкой:

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)

Строка 127: callback.onDataChanged(Integer.valueOf(gameItem.getTime()));

1 Ответ

0 голосов
/ 04 марта 2019

Вы можете создать наблюдаемое как:

в вашем адаптере:

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

Глобальное поле в адаптере:

private IMyCallback callback

Внутренний конструктор адаптера

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

Теперь ваша деятельность make реализует IMyCallback и метод переопределения onDataChanged.И когда вы создаете свой адаптер, отправляющий как callback YourActivity.this.

finnaly, вам нужно сделать так:

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

после этого вызова вы получите обновление в вашем методе переопределения onDataChanged в вашей активностиучебный класс.наслаждайтесь

------------ Обновите ----------- в своей деятельности, когда вы будете реализовывать интерфейс, вы получите метод, подобный

     @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));
    }
...