Android 如何在同一活动中多次单击按钮
我在Android 如何在同一活动中多次单击按钮,android,android-recyclerview,Android,Android Recyclerview,我在RecyclerView中有TextView和按钮,当我点击按钮时,我把按钮上的文本作为数字,当我尝试递归setonclicklistener时,我希望该数字增加1。应用程序不工作 我有两个活动,每个活动都调用同一个适配器 适配器的代码 public class AzkaarAdapter extends RecyclerView.Adapter<AzkaarAdapter.AzkaarViewHolder> { ArrayList<AzkarForm&g
RecyclerView
中有TextView
和按钮
,当我点击按钮时,我把按钮上的文本作为数字,当我尝试递归setonclicklistener
时,我希望该数字增加1。应用程序不工作
我有两个活动,每个活动都调用同一个适配器
适配器的代码
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));
}
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;
}
recyclerView=(recyclerView)findViewById(R.id.recyclerviewcard);
layoutManager=新建LinearLayoutManager(DetailsActivity.this,LinearLayoutManager.HORIZONTAL,false);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setHasFixedSize(true);
循环视图。滚动位置(pos);
adapter=new-AzkaarAdapter(AzkaarData.getArrayListData(),this);
recyclerView.setAdapter(适配器);
SnapHelper SnapHelper=新的LinearSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
toolbar=(toolbar)findviewbyd(R.id.toolbar);
设置支持操作栏(工具栏);
}
@凌驾
公共空间和MClick(INTP){
}
@凌驾
第二次单击上的公共无效(int p){
AzkarForm=list.get(p);
按下=(按钮)findViewById(R.id.press);
int currentNum=Integer.parseInt(按.getText().toString());
int num=azkarForm.getNumber();
if(currentNum
根据您的布局替换按钮id。好的,首先,您不需要使用第二个IConclick
回调,因为您希望它执行其他操作并不意味着您需要两个按钮id,您可以为这两个活动设置相同的ItemCallback
接口,然后调用switch
语句以了解情况从布局中单击了哪个小部件。我可以更轻松地向您展示您提供的代码,我没有测试任何代码。
从我所看到的第一个活动
,运行良好(我假设这不会引起问题)。除了可读性之外,我建议为该活动
初始化上下文
(私有上下文上下文=此
)的全局实例,然后代替新意图(this,DetailsActivity.class)
您应该有新的意图(context,DetailsActivity.class)
,因为有时候这个可以指向ClickListener
而不是活动
对于第二个活动
,计数器
和按钮
的设置文本
的逻辑似乎很好,除非您已经在视图持有者
中初始化了按钮
,因此您不需要在单击侦听器中再次初始化它。您所要做的就是将视图传递给侦听器呃。(请参见我对适配器
和ViewHolder
代码的编辑)另外,如果currentNum
,我不知道为什么要调用click事件的新实例
你想让点击一直自动到某个数字,还是每次点击直到某个数字
无论如何,让我们来为您解决这个问题。我在编写此代码时假设您希望每次用户单击R.id.press
时计数器都会上升
FirstActivity
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));
}
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;
}
因此,正如我上面所建议的,更改上下文引用
@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;
}
第二活动
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));
}
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;
}
ViewHolder
您的新单击侦听器应如下所示:
@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);
}*/
}
}
}
@覆盖
公共void onClick(视图v){
如果(itemClickCallback!=null){
itemClickCallback.onItemClick(v,getAdapterPosition());
/*if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.LOLLIPOP){
Pair p1=Pair.create((视图)示例,“qoute”);
ActivityOptions Compat options=ActivityOptions Compat.MakeScenetTransitionAnimation(此为p1);
}*/
}
}
}
现在,您为侦听器提供了一个干净的框架,并且正在传递正确的视图
并调用正确的上下文
,您可以相应地应用逻辑,而不会混淆回调
希望这能有所帮助。我尝试过这个概念,但我需要多次执行按钮单击。它工作正常,但当我返回到recyclerview并单击它时,当我在第二个活动中删除适配器集时,它没有响应。它可以工作。您可以扩展您遇到的问题吗?当我单击第一个活动中的任何项目时,第二个活动是launch但当返回到第一个活动以单击另一个项目时,单击未响应时的事件,我试图在第二个活动中删除将侦听器设置为适配器的设置,然后单击第一个活动将响应I put adapter.setItemClickCallback(此);在onResume()中方法和它的工作。谢谢你的帮助,你让我比以前更了解活动和界面之间的关系。我很高兴我能提供帮助。愉快的编码。