2016-12-25 33 views
0

我有TextViewButtonRecyclerView我把文本上Button的數量當我點擊按鈕我想1這個數字的增加,當我嘗試遞歸setonclicklistener應用程序不工作 我有兩個活動,他們每個人的調用相同的適配器 適配器的代碼如何在按鈕點擊多次在同一活動

public class AzkaarAdapter extends RecyclerView.Adapter<AzkaarAdapter.AzkaarViewHolder> { 
    ArrayList<AzkarForm> azkarForms=new ArrayList<AzkarForm>(); 
    Context ctx; 

    private static ItemClickCallback itemClickCallback; 

    public interface ItemClickCallback { 
     void onItemClick(int p); 
     void onSecondaryIconClick(int p); 
    } 

    public void setItemClickCallback(final ItemClickCallback itemClickCallback) { 
     this.itemClickCallback = itemClickCallback; 
    } 
    public AzkaarAdapter (ArrayList<AzkarForm> azkarForms,Context ctx){ 
     this.azkarForms=azkarForms; 
     this.ctx=ctx; 
    } 
    @Override 
    public AzkaarViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     AzkaarViewHolder azkaarViewHolder; 
     if(ctx instanceof MainActivity){ 
     View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_layout,parent,false); 
     azkaarViewHolder=new AzkaarViewHolder(view,ctx,azkarForms); 
     } 
     else { 
      View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_details,parent,false); 
      azkaarViewHolder=new AzkaarViewHolder(view,ctx,azkarForms); 
     } 
     return azkaarViewHolder; 
    } 


    @Override 
    public void onBindViewHolder(AzkaarViewHolder holder, int position) { 

     AzkarForm azkarForm=azkarForms.get(position); 
     if(ctx instanceof MainActivity) { 
      holder.sample.setText(azkarForm.getComplete_morning()); 
      holder.number.setText(String.valueOf(azkarForm.getNumber())); 
     }else { 
      holder.sample.setText(azkarForm.getComplete_morning()); 
      holder.tally_count.setText(getTextNumber(azkarForm.getNumber())); 

     } 

    } 

    public String getTextNumber(int number){ 
     String numberText=""; 
     switch (number){ 
      case 1: 
       numberText="مرة واحدة"; 
       break; 
      case 3: 
       numberText="ثلاث مرات"; 
       break; 
      case 4: 
       numberText="أربع مرات"; 
       break; 
      case 7: 
       numberText="سبع مرات"; 
       break; 
      case 10: 
       numberText="عشر مرات"; 
       break; 
      case 100: 
       numberText="مائة مرة"; 
       break; 
     } 
     return numberText; 

    } 


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

    public static class AzkaarViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 

     TextView sample, number; 
     View container; 
     Context ctx; 
     ArrayList<AzkarForm> azkarForms = new ArrayList<AzkarForm>(); 
     Button tally_count,press,next; 


     public AzkaarViewHolder(View itemView, Context ctx, ArrayList<AzkarForm> azkarForms) { 
      super(itemView); 
      this.ctx = ctx; 


      //itemView.setOnClickListener(this); 
      this.azkarForms = azkarForms; 
      if(this.ctx instanceof MainActivity) { 
       sample = (TextView) itemView.findViewById(R.id.sample); 
       number = (TextView) itemView.findViewById(R.id.number); 
       container = itemView.findViewById(R.id.container); 
       container.setOnClickListener(this); 
      }else { 
       sample = (TextView) itemView.findViewById(R.id.sample); 
       tally_count=(Button)itemView.findViewById(R.id.count); 
       press=(Button)itemView.findViewById(R.id.press); 
       press.setOnClickListener(this); 
       next=(Button)itemView.findViewById(R.id.next); 
      } 
      //container.setOnClickListener(this); 



     } 


     @Override 
     public void onClick(View v) { 


      if (v.getId() == R.id.container){ 
       itemClickCallback.onItemClick(getAdapterPosition()); 
      } else { 
       itemClickCallback.onSecondaryIconClick(getAdapterPosition()); 
      } 

      /*if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.LOLLIPOP){ 
       Pair<View, String> p1 = Pair.create((View)sample, "qoute"); 

       ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, p1); 
      }*/ 


     } 
    } 

} 

第一個活動

recyclerView =(RecyclerView) findViewById(R.id.recyclerviewcard); 
     layoutManager=new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.setHasFixedSize(true); 
     adapter=new AzkaarAdapter(AzkaarData.getArrayListData(),this); 
     recyclerView.setAdapter(adapter); 

     adapter.setItemClickCallback(this); 

     toolbar=(Toolbar)findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
    } 

    @Override 
    public void onItemClick(int p) { 
     //int position=getAdapterPosition(); 
     AzkarForm azkarForm= list.get(p); 
     Intent intent=new Intent(this,DetailsActivity.class); 
     intent.putExtra("numbers",azkarForm.getNumber()); 
     intent.putExtra("sample",azkarForm.getSample()); 
     intent.putExtra("complete",azkarForm.getComplete_morning()); 
     intent.putExtra("position",p); 
     this.startActivity(intent); 
    } 

    @Override 
    public void onSecondaryIconClick(int p) { 

    } 

次活動

recyclerView =(RecyclerView) findViewById(R.id.recyclerviewcard); 
    layoutManager=new LinearLayoutManager(DetailsActivity.this,LinearLayoutManager.HORIZONTAL,false); 
    recyclerView.setLayoutManager(layoutManager); 
    recyclerView.setHasFixedSize(true); 
    recyclerView.scrollToPosition(pos); 
    adapter=new AzkaarAdapter(AzkaarData.getArrayListData(),this); 
    recyclerView.setAdapter(adapter); 
    SnapHelper snapHelper = new LinearSnapHelper(); 
    snapHelper.attachToRecyclerView(recyclerView); 


    toolbar=(Toolbar)findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

} 

@Override 
public void onItemClick(int p) { 

} 

@Override 
public void onSecondaryIconClick(int p) { 

    AzkarForm azkarForm= list.get(p); 
    press=(Button) findViewById(R.id.press); 
    int currentNum=Integer.parseInt(press.getText().toString()); 
    int num=azkarForm.getNumber(); 

    if(currentNum<num){ 
     currentNum++; 
     onSecondaryIconClick(p); 
    } 

    press.setText(String.valueOf(currentNum)); 


} 

回答

0

好了,所以,第一關就沒有必要爲您的SecondaryIconClick回調,都是因爲你希望它做別的事情並不意味着你需要他們兩個,你可以設置相同ItemCallback接口兩個活動,然後調用switch聲明來知道從佈局中點擊了哪個小部件。我更容易向您展示您提供的代碼,我還沒有測試過任何此代碼。

從我能看到的第一個Activity,工作正常(我認爲這不是造成問題)。除了可讀性,我會建議初始化Contextprivate Context context = this)的全局實例爲activity,然後代替new Intent(this, DetailsActivity.class)你應該有new Intent(context, DetailsActivity.class)因爲有時候'this'可以指向ClickListener而非Activity

對於第二Activity邏輯爲countersetTextbutton似乎罰款,除非你已經在ViewHolder初始化你Button,所以你不需要在點擊監聽器再次進行初始化。你所要做的就是將視圖傳遞給監聽者。 (請參閱我的編輯AdapterViewHolder代碼)也,我不知道你爲什麼要調用一個新的點擊事件實例,如果。

你希望點擊是自動的直到某個數字,或者只是每次點擊直到某個數字?

無論如何,我們來爲您解決這個問題。我正在編寫此代碼,假設您希望每次用戶點擊R.id.press時計數器都會增加。

FirstActivity

因此,正如我上面建議更改上下文參考。

@Override 
    public void onItemClick(View v, int position) { 
     switch (v.getId()) { 
      case R.id.container: 
      AzkarForm azkarForm= list.get(position); 
      Intent intent=new Intent(context, DetailsActivity.class); 
      intent.putExtra("numbers",azkarForm.getNumber()); 
      intent.putExtra("sample",azkarForm.getSample()); 
      intent.putExtra("complete",azkarForm.getComplete_morning()); 
      intent.putExtra("position", position); 
      context.startActivity(intent); 
      break; 
    } 

SecondActivity

recyclerView =(RecyclerView) findViewById(R.id.recyclerviewcard); 
    layoutManager=new LinearLayoutManager(DetailsActivity.this,LinearLayoutManager.HORIZONTAL,false); 
    recyclerView.setLayoutManager(layoutManager); 
    recyclerView.setHasFixedSize(true); 
    recyclerView.scrollToPosition(pos); 
    adapter=new AzkaarAdapter(AzkaarData.getArrayListData(),this); 
    recyclerView.setAdapter(adapter); 
    SnapHelper snapHelper = new LinearSnapHelper(); 
    snapHelper.attachToRecyclerView(recyclerView); 
    toolbar=(Toolbar)findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

} 

@Override 
public void onItemClick(View v, int position) { 
    switch(v.getId()) { 
     case R.id.press: 
      AzkarForm azkarForm= list.get(position); 
      int currentNum=Integer.parseInt(press.getText().toString()); 
      int num = azkarForm.getNumber(); 
       if(currentNum < num){ 
       currentNum++; 
       } 
      v.setText(String.valueOf(currentNum)); 
      break; 
} 

RecyclerViewAdapter

您的新接口的回調應該是:

public interface ItemClickCallback { 
     void onItemClick(View v, int position); 
    } 

public void setItemClickCallback(final ItemClickCallback itemClickCallback) { 
     this.itemClickCallback = itemClickCallback; 
    } 

ViewHo lder連續

新的點擊偵聽器應該是這樣的:

 @Override 
     public void onClick(View v) { 
      if (itemClickCallback != null) { 
       itemClickCallback.onItemClick(v, getAdapterPosition()); 
      /*if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.LOLLIPOP){ 
       Pair<View, String> p1 = Pair.create((View)sample, "qoute"); 

       ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, p1); 
      }*/ 
      } 
     } 
    } 

現在,你有你的聽衆一個乾淨的框架,你傳遞了正確的views和調用正確的context,你能申請邏輯相應地在callbacks之間沒有混淆。

希望這會有所幫助。

+0

它工作正常,但當我回到recyclerview並點擊它時,它不反應,當我在第二個活動中刪除一組適配器時,它工作 –

+0

做你得到一個錯誤? –

+0

沒有任何錯誤 –

0
final Button counter = (Button) findViewById(R.id.counter_button); 
counter.setText("1"); 

counter.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
    int currNum = Integer.parseInt(counter.getText().toString()); 
    counter.setText("" + currNum + 1); 
    } 
}); 

替換按鈕ID,按您的佈局。

+0

我嘗試這個概念,但我需要按鈕點擊執行很多次 –

相關問題