【问题标题】:How do I detect if a button from an activity is clicked while inside a RecyclerView adapter如何检测在 RecyclerView 适配器内是否单击了活动中的按钮
【发布时间】:2017-11-07 20:36:34
【问题描述】:

我的活动中有这个方法 (CreatePhotostoryActivity):

@Override
public void showEditField(Moment oldMoment, final int index){
    listRecycler.setVisibility(View.GONE);
    editCaption.setVisibility(View.VISIBLE);
    saveCancelNavbar.setVisibility(View.VISIBLE);
    momentView.setVisibility(View.GONE);
    photoStoryNavbar.setVisibility(View.GONE);
    header.setVisibility(View.GONE);
    Picasso.with(getApplicationContext()).load(oldMoment.photoUri).into(displayPhoto);

    imageCaption.setText("");


    imageCaption.setText(oldMoment.caption);

    backIcon.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            closeEditMoment();
        }
    });

    saveText.setText("Save Moment");

    saveButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            updateMoment(imageCaption.getText().toString(), index);
            Intent i = new Intent(CreatePhotostoryActivity.this, RVAdapter.class);
            i.putExtra("isSaved", true);
            startActivity(i);
        }
    });

    cancelButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            closeEditMoment();
            Intent i = new Intent(CreatePhotostoryActivity.this, RVAdapter.class);
            i.putExtra("isSaved", false);
            startActivity(i);
        }
    });
}

在我的RecyclerView 适配器中,showEditField 是使用接口调用的,它确实有效,只是我无法检测到是否单击了saveButtoncancelButton。这就是在我的RecyclerView 适配器(RVAdapter)的onBindViewHolder 方法中调用它的方式:

((RecyclerView.ViewHolder) momentViewHolder).itemView.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View view) {
        mAdapterCallback.showEditField(moments.get(position), position);
        Intent intent = ((CreatePhotostoryActivity) mContext).getIntent();
        Boolean isSaved = intent.getExtras().getBoolean("isSaved");
        if (isSaved) {
            holder.momentCaption.setText(moments.get(position).caption);
            holder.momentPlaceholder.setVisibility(View.GONE);
            holder.momentCaption.setVisibility(View.VISIBLE);
        } else {
            holder.momentPlaceholder.setVisibility(View.VISIBLE);
            holder.momentCaption.setVisibility(View.GONE);
        }
        notifyDataSetChanged();
});

请注意我尝试使用意图来找出单击了哪个按钮。它不起作用。即使点击了saveButtonmomentCaption 仍然消失,momentPlaceHolder 仍然可见。该应用程序随后也会崩溃。

编辑:我认为在设置momentCaptionmomentPlaceholder 的值之前调用此mAdapterCallback.showEditField(moments.get(position), position); 是有问题的,因为showEditField 在从适配器检索意图之前调用其他方法(例如closeEditMoment()

【问题讨论】:

标签: android android-intent android-recyclerview


【解决方案1】:

使用saveBtnClick()cancelBtnClick() 等两种方法创建interface

在您的Activity 中实现interface

RecyclerViewViewHolder 中的两个按钮实现 Click 侦听器,并使用 Inteface's 对象调用适当的方法。

//接口

 public interface ManageButtonClicks
 {
  void saveBtnClick();
 }

//活动

public class MainActivity extends AppCompactActivity implements ManageButtonClicks
{
       ManageButtonClicks manageButtonClicks=this;
       MyAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainactivity);
   //Do the operations
    adapter = new MyAdapter(this,adapterList,manageButtonClicks);
    recyclerView.setAdapter(adapter);

}
  void saveBtnClick()
  {
    Toast.makeText(this,"Clicked",Toast.LENGTH_SHORT).show();
  }
}

//适配器类

   public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>
   {
    ManageButtonClicks manageButtonClicks;

public MyAdapter(Context context, List< ModelClass > data, ManageButtonClicks manageButtonClicks)
{
    inflater = LayoutInflater.from(context);
    this.mDataList = data;
    this.ctx = context;
    util = new Util(ctx);
    this.manageButtonClicks = manageButtonClicks;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{

    ViewGroup nonPrimeRow = (ViewGroup) inflater.inflate(R.layout.rowlayout, parent, false);
    MyViewHolder_NON_PRIME holderNonPrime = new MyViewHolder_NON_PRIME(nonPrimeRow);
    return holderNonPrime;
}
  @Override
    public void onBindViewHolder(MyViewHolder holder, final int position)
    {
    ModelClass current = mDataList.get(position);
    MyViewHolder_NON_PRIME holder_not_prime = (MyViewHolder_NON_PRIME) holder;
    holder_not_prime.setdata(current);
}
class MyViewHolder extends RecyclerView.ViewHolder
{

    public MyViewHolder(View itemView)
    {
        super(itemView);
    }
}

public class MyViewHolder_NON_PRIME extends MyViewHolder
{

    private Button btnSave;

    public MyViewHolder_NON_PRIME(View view)
    {
        super(view);
        btnSave = (MonteButton) view.findViewById(R.id.btnSave);
    }

    public void setdata(final ModelClass current)
    {
        btnSave.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                manageButtonClicks.saveBtnClick();
            }
        });
    }
}

【讨论】:

  • 谢谢,但saveButtoncancelButton 仅在活动中被引用。
  • 如果我错了,请纠正我。我假设您有一个带有自定义行的 RecyclerView,其中包含 2 个按钮保存和取消。你想对每个按钮点击做一些特定的操作。我说的对吗?
  • 是的,这就是我想要的。
  • 尝试编辑后的答案。甚至我之前也想做这样的事情。
【解决方案2】:

你在 recyclerView 适配器中有一个全局变量:

    RecyclerViewAdapter {
    private boolean isSaveButtonClicked = false;
    private boolean isCancelButtonClicked = false;

    public void saveButtonClicked(){
    isSaveButtonClicked = true;
    }}

    public void cancelButtonClicked(){
    isCancelButtonClicked = true;
    }}

当您的活动调用 onclickListeners 时,您会注意到您的适配器。

     CreatePhotostoryActivity(){

     private RecyclerView adapter;

     onSaveButtonClicked(){
     adapter.saveButtonClicked();
     }

    onCancelButtonClicked(){
    adapter.cancelButtonClicked();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多