2016-12-25 32 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

我尝试这个概念,但我需要按钮点击执行很多次 –

相关问题