列表视图中的button正在创build滚动和点击button上的问题

我在列表视图中的一些列表项中有三个button,并单击该button我想要更改该列表项的布局,但是我面临的问题列在下面。

1)。 点击button后,另一个列表项目布局被更改。 2)。 在列表视图的滚动另一个列表项目布局得到改变,我没有点击。

这是适配器类的代码。

import java.util.ArrayList; import com.xsinfosol.DOT.R; import com.xsinfosol.DOT.ImageLoading.ImageLoader; import com.xsinfosol.DOT.LibraryClasses.RippleView; import com.xsinfosol.DOT.model.DOT_Common_Model; import android.content.Context; import android.graphics.drawable.Drawable; import android.support.v7.internal.widget.ButtonBarLayout; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.WindowManager.LayoutParams; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; public class Agenda_Adapter extends BaseAdapter { Context context; ArrayList<DOT_Common_Model> arrayList; ViewHolder viewHolder; public Agenda_Adapter(Context context , ArrayList<DOT_Common_Model> arrayList) { // TODO Auto-generated constructor stub this.context = context; this.arrayList = arrayList; } @Override public int getCount() { // TODO Auto-generated method stub return arrayList.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return arrayList.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub if(convertView==null) { viewHolder = new ViewHolder(); convertView = LayoutInflater.from (context).inflate(R.layout.agenda_event_list_item, null); viewHolder.linearLayout = (LinearLayout)convertView.findViewById(R.id.agenda_button_layout); viewHolder.linearLayout.setVisibility(View.GONE); viewHolder.checkBox = (CheckBox)convertView.findViewById(R.id.agenda_event_checkbox); viewHolder.eventName = (TextView)convertView.findViewById(R.id.agenda_event_name); viewHolder.imageView = (ImageView)convertView.findViewById(R.id.agenda_event_imae); viewHolder.place = (TextView)convertView.findViewById(R.id.agenda_event_place); viewHolder.time = (TextView)convertView.findViewById(R.id.agenda_event_date_time); viewHolder.going = (RippleView)convertView.findViewById(R.id.agenda_rippleview_going); viewHolder.notGoing = (RippleView)convertView.findViewById(R.id.agenda_rippleview_not_going); viewHolder.mayBe = (RippleView)convertView.findViewById(R.id.agenda_rippleview_maybe); viewHolder.going.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub viewHolder.going.setVisibility(View.GONE); viewHolder.notGoing.setVisibility(View.GONE); viewHolder.mayBe.setVisibility(View.GONE); Drawable tick = context.getResources().getDrawable(R.drawable.ic_action_tick); tick.setBounds(0,0, 30, 30); Button going = new Button(context); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(new LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 40)); params.setMargins(10,0, 10, 4); going.setLayoutParams(params); going.setBackgroundColor(context.getResources().getColor(android.R.color.holo_green_dark)); going.setText("Going"); going.setTextSize(15); going.setTextColor(R.color.white); going.setCompoundDrawables(null, null, tick, null); going.setCompoundDrawablePadding(5); going.setGravity(Gravity.CENTER); if(viewHolder.linearLayout!=null) viewHolder.linearLayout.removeAllViews(); viewHolder.linearLayout.addView(going); } }); viewHolder.notGoing.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub viewHolder.going.setVisibility(View.GONE); viewHolder.notGoing.setVisibility(View.GONE); viewHolder.mayBe.setVisibility(View.GONE); Drawable cross = context.getResources().getDrawable(R.drawable.ic_action_cancel); cross.setBounds(0,0, 30, 30); Button button = new Button(context); LinearLayout.LayoutParams paramsCross = new LinearLayout.LayoutParams(new LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 40)); paramsCross.setMargins(10,0, 10, 4); button.setLayoutParams(paramsCross); button.setBackgroundColor(context.getResources().getColor(R.color.red)); button.setText("Not Going"); button.setTextSize(15); button.setTextColor(R.color.white); button.setCompoundDrawables(null, null, cross, null); button.setCompoundDrawablePadding(5); button.setGravity(Gravity.CENTER); if(viewHolder.linearLayout!=null) viewHolder.linearLayout.removeAllViews(); viewHolder.linearLayout.addView(button); } }); viewHolder.mayBe.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub viewHolder.going.setVisibility(View.GONE); viewHolder.notGoing.setVisibility(View.GONE); viewHolder.mayBe.setVisibility(View.GONE); Drawable mayBe = context.getResources().getDrawable(R.drawable.ic_action_emo_err); mayBe.setBounds(0,0, 30, 30); Button maybe = new Button(context); LinearLayout.LayoutParams paramsMaybe = new LinearLayout.LayoutParams(new LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 40)); paramsMaybe.setMargins(10,0, 10, 4); maybe.setLayoutParams(paramsMaybe); maybe.setBackgroundColor(context.getResources().getColor(R.color.yellow)); maybe.setText("May Be"); maybe.setTextSize(15); maybe.setTextColor(R.color.white); maybe.setCompoundDrawables(null, null, mayBe, null); maybe.setCompoundDrawablePadding(5); maybe.setGravity(Gravity.CENTER); if(viewHolder.linearLayout!=null) viewHolder.linearLayout.removeAllViews(); viewHolder.linearLayout.addView(maybe); } }); viewHolder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub int getPosition = (Integer)buttonView.getTag(); arrayList.get(getPosition).setChecked(buttonView.isChecked()); } }); convertView.setTag(viewHolder); convertView.setTag(R.id.agenda_event_checkbox, viewHolder.checkBox); convertView.setTag(R.id.agenda_event_imae, viewHolder.imageView); convertView.setTag(R.id.agenda_event_name, viewHolder.eventName); convertView.setTag(R.id.agenda_event_place, viewHolder.place); convertView.setTag(R.id.agenda_event_date_time, viewHolder.time); convertView.setTag(R.id.agenda_button_layout, viewHolder.linearLayout); convertView.setTag(R.id.agenda_rippleview_going, viewHolder.going); convertView.setTag(R.id.agenda_rippleview_not_going, viewHolder.notGoing); convertView.setTag(R.id.agenda_rippleview_maybe, viewHolder.mayBe); }else viewHolder = (ViewHolder)convertView.getTag(); viewHolder.checkBox.setTag(position); viewHolder.going.setTag(position); viewHolder.notGoing.setTag(position); viewHolder.mayBe.setTag(position); ImageLoader imageLoader = new ImageLoader(context); ImageView imageView = viewHolder.imageView; imageLoader.DisplayImage(arrayList.get(position).getImage(), imageView); viewHolder.checkBox.setChecked(arrayList.get(position).ischecked()); switch (arrayList.get(position).getFlag()) { case "0": // hasn's seleted any option if(viewHolder.linearLayout.getVisibility()==View.GONE) viewHolder.linearLayout.setVisibility(View.VISIBLE); if(viewHolder.going.getVisibility()==View.GONE) viewHolder.going.setVisibility(View.VISIBLE); if(viewHolder.mayBe.getVisibility()==View.GONE) viewHolder.mayBe.setVisibility(View.VISIBLE); if(viewHolder.notGoing.getVisibility()==View.GONE) viewHolder.notGoing.setVisibility(View.VISIBLE); break; case "1": // selected going viewHolder.going.setVisibility(View.GONE); viewHolder.notGoing.setVisibility(View.GONE); viewHolder.mayBe.setVisibility(View.GONE); Drawable tick = context.getResources().getDrawable(R.drawable.ic_action_tick); tick.setBounds(0,0, 30, 30); Button going = new Button(context); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(new LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 40)); params.setMargins(10,0, 10, 4); going.setLayoutParams(params); going.setBackgroundColor(context.getResources().getColor(android.R.color.holo_green_dark)); going.setText("Going"); going.setTextSize(15); going.setTextColor(context.getResources().getColor(R.color.white)); going.setCompoundDrawables(null, null, tick, null); going.setCompoundDrawablePadding(5); going.setGravity(Gravity.CENTER); if(viewHolder.linearLayout!=null) viewHolder.linearLayout.removeAllViews(); viewHolder.linearLayout.addView(going); break; case "2": // select not going viewHolder.going.setVisibility(View.GONE); viewHolder.notGoing.setVisibility(View.GONE); viewHolder.mayBe.setVisibility(View.GONE); Drawable cross = context.getResources().getDrawable(R.drawable.ic_action_cancel); cross.setBounds(0,0, 30, 30); Button button = new Button(context); LinearLayout.LayoutParams paramsCross = new LinearLayout.LayoutParams(new LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 40)); paramsCross.setMargins(10,0, 10, 4); button.setLayoutParams(paramsCross); button.setBackgroundColor(context.getResources().getColor(R.color.red)); button.setText("Not Going"); button.setTextSize(15); button.setTextColor(context.getResources().getColor(R.color.white)); button.setCompoundDrawables(null, null, cross, null); button.setCompoundDrawablePadding(5); button.setGravity(Gravity.CENTER); if(viewHolder.linearLayout!=null) viewHolder.linearLayout.removeAllViews(); viewHolder.linearLayout.addView(button); break; case "3": // selected may be viewHolder.going.setVisibility(View.GONE); viewHolder.notGoing.setVisibility(View.GONE); viewHolder.mayBe.setVisibility(View.GONE); Drawable mayBe = context.getResources().getDrawable(R.drawable.ic_action_emo_err); mayBe.setBounds(0,0, 30, 30); Button maybe = new Button(context); LinearLayout.LayoutParams paramsMaybe = new LinearLayout.LayoutParams(new LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 40)); paramsMaybe.setMargins(10,0, 10, 4); maybe.setLayoutParams(paramsMaybe); maybe.setBackgroundColor(context.getResources().getColor(R.color.yellow)); maybe.setText("May Be"); maybe.setTextSize(15); maybe.setTextColor(context.getResources().getColor(R.color.black_overlay)); maybe.setCompoundDrawables(null, null, mayBe, null); maybe.setCompoundDrawablePadding(5); maybe.setGravity(Gravity.CENTER); if(viewHolder.linearLayout!=null) viewHolder.linearLayout.removeAllViews(); viewHolder.linearLayout.addView(maybe); break; case "4": // event doesn't have any invitatin option if(viewHolder.linearLayout.getVisibility()==View.VISIBLE) viewHolder.linearLayout.setVisibility(View.GONE); break; } viewHolder.eventName.setText(arrayList.get(position).getName()); viewHolder.place.setText(arrayList.get(position).getPlace()); viewHolder.time.setText(arrayList.get(position).getTime()); return convertView; } static class ViewHolder { TextView eventName , place, time; CheckBox checkBox; ImageView imageView; LinearLayout linearLayout; RippleView going , notGoing , mayBe; } } 

请帮我,我困在这非常糟糕,

Solutions Collecting From Web of "列表视图中的button正在创build滚动和点击button上的问题"

第1步:在这一行之后放置点击监听器(viewHolder =(ViewHolder)convertView.getTag())

第2步:在onclick方法删除视图创build/删除逻辑。 更改模型值(“在您的情况下当前项目标志”),并调用notifyDataset更改方法

 @Override public void onClick(View view) { //Set the flag based on your view click ((DOT_Common_Model) getItem( int position)).setFlag(0); notifyDatasetChanged(); } 

第3步:根据您的模型值更改视图(“标志值”)

 if(((DOT_Common_Model) getItem( int position)).getFlag()==0){ view1.setVisibility(View.VISIBLE); view2.setVisibility(View.GONE); view3.setVisibility(View.GONE); }else if(((DOT_Common_Model) getItem( int position)).getFlag()==1){ view1.setVisibility(View.GONE); view2.setVisibility(View.VISIBLE); view3.setVisibility(View.GONE); }else if(((DOT_Common_Model) getItem( int position)).getFlag()==2){ view1.setVisibility(View.GONE); view2.setVisibility(View.GONE); view3.setVisibility(View.VISIBLE); }else{ view1.setVisibility(View.VISIBLE); view2.setVisibility(View.VISIBLE); view3.setVisibility(View.VISIBLE); } 

注意:列表视图只绑定数据,并且不会为每个数据值更改视图持有者视图对象,我们需要根据数据值更改视图可见性/背景。 如果你使用“ 如果条件 ”,那么“ 其他 ”必须在那里。

我看到你正在使用的适配器代码只用于条件,列表视图不是那么聪明,所以只要不使用其他部分然后执行一个事件然后执行一个事件,那么ListView也可能改变下一个位置视图,可见性或任何你的if部分, 所以请在你的适配器代码中写下其他部分

我build议使用RecyclerView更高级的ListView。

简答:

把你的onClick监听器放在if else块之外:

 if(convertView==null) { //BLABLABLA } else { } // WRITE YOUR CLICK LISTENER HERE viewHolder.mayBe.setOnClickListener(new OnClickListener() { ..... }); viewHolder.notGoing.setOnClickListener(new OnClickListener() { .. }); viewHolder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { .... } ); 

为什么问题发生

你在做什么叫做ViewHolderPattern。 主要用于通过避免不必要的findViewById来增加滚动列表视图的性能,这是一个繁重的过程。

让我们看看它是如何工作的:

请看这个图片显示正常列表: 在这里输入图像说明

我们的适配器有很多行,但只有3个填充视图。 当你使你的适配器,只有前3行是空的,应该充气。 其他视图将使用之前创build的相同视图。

 @Override public View getView(int position, View convertView, ViewGroup parent) { // in our example, the convert view is only null for the first 3 items if(convertView==null) { } else { } } 

注意是:如果有其他的块,你不应该设置任何东西。 你应该find他们的意见,并将其分配给您的viewHolder,并查看相关的东西(如边缘,填充,文本大小,…)。 你不应该做的资源或单击该块相关的事情(如setText,setBitmap,Onclicklistener,…)

为什么? 我们之前回答了! 因为它只会被称为填充视图的第一个项目!

你不处理else情况下的点击监听器:

 else if (convertView==null) 

写所有OnClicklistener的外面(上面的return convertView )。