0

の内側に、私は私の活動でこの方法(CreatePhotostoryActivity)持っている間活動からボタンがクリックされた場合にどのように検出します:私のRecyclerViewアダプタでRecyclerViewアダプタ

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

showEditFieldは、インタフェースを使用して呼び出され、 saveButtonまたはcancelButtonのいずれかをクリックできなかったことを除いて動作します。これは、それが私の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(); 
}); 

がクリックされたボタンを見つけるために意図を使用しての私の試みに注意してください。それは動作しません。 をクリックしてもがなくなり、momentPlaceHolderが表示されたままになります。その後、アプリもクラッシュします。

編集:私は意思がアダプタから取得される前momentCaptionmomentPlaceholderの値を設定する前にこのmAdapterCallback.showEditField(moments.get(position), position);を呼び出すとshowEditField呼び出し、他の方法(例えばcloseEditMoment()いるので、問題があると思います

+0

は 'https://stackoverflow.com/questions/20132359/how-do-i-add-an-onclicklistener-to-a-button-inside-a-listview-adapter –

答えて

0

あなたは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(); 
    } 
} 
0

のようなinterface 2を持つメソッドを作成します。 saveBtnClick()cancelBtnClick()

はあなたActivity

実装Cにinterfaceを実装しますあなたのRecyclerViewViewHolderの両方のボタンのリッスンリスナーを呼び出して、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(); 
      } 
     }); 
    } 
} 
+0

感謝を見ましたが、 saveButton'と 'cancelButton'はアクティビティでのみ参照されます。 – Bargain23

+0

私が間違っている場合は私を修正してください。私は、RecyclerViewに2つのボタンSaveとCancelを持つカスタム行を持っていると仮定しています。あなたは、各ボタンのクリックに対していくつかの特定の操作を実行する必要があります。私は正しいですか? – Sreyas

+0

はい、そうです。 – Bargain23

関連する問題