如何在RecyclerView适配器内

时间:2017-11-07 11:41:29

标签: android android-intent android-recyclerview recycler-adapter

我的活动(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之外,它确实有效。这就是我onBindViewHolder适配器RecyclerView方法(RVAdapter)中调用它的方式:

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

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

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

2 个答案:

答案 0 :(得分:0)

使用interfacesaveBtnClick()两种方法创建cancelBtnClick()

interface中实施Activity

ViewHolder的{​​{1}}中的两个按钮实施点击监听器,并使用RecyclerView对象调用适当的方法。

//接口

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

答案 1 :(得分:0)

您在recyclelerView适配器中有一个全局变量:

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