listview,自定义适配器在滚动时无法正常工作

时间:2017-05-29 13:33:52

标签: android listview custom-adapter

我正在使用customAdapter在列表视图中显示mydata。 它有一些条件可以检查一些文件然后改变linearlayout的背景颜色,或者改变一些textview的颜色。

每件事都是正确的,直到加载......问题如下: 1 - 之后当我向下滚动列表并向上滚动时,所有项目的颜色都会改变! 2-当我勾选一个复选框并向下滚动时,其他一些行将自动检查!

3-我在main activity中使用这个自定义适配器。没关系。但是当我为listview设置listview.setOnItemClickListener时将无法正常工作!!!

我的代码出了什么问题?

下面是customadapter类代码:

package ir.telad.houseagancy;
... 
public class CustomAdapter extends BaseAdapter {
private Activity activity;
private ArrayList data;
private LayoutInflater inflater;
int i=0;
/*************  CustomAdapter Constructor *****************/
public CustomAdapter(Activity a, ArrayList d,String re) {
       /********** Take passed values **********/
        activity = a;
        data=d;
        inflater = ( LayoutInflater )activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);    
}

@Override
public int getCount() {
    if(data.size()<=0)
        return 1;
    return data.size();
}

@Override
public Object getItem(int position) {
    return position;
}

public class ViewHolder{
    public TextView name;
    public TextView moaref;
    public TextView address;
    public TextView tel;
    public TextView rahn;
    public TextView ejare;
    public TextView date;
    public ImageView image;
    public TextView foori;
    public LinearLayout layout1;
    public CheckBox checkBox;
    //public TableRow tblr;
}
@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    final View vi;
     final ViewHolder holder;
      ListModel tempValues;
     if(convertView==null){

         /****** Inflate list_item.xml file for each row ( Defined below ) *******/
         convertView = inflater.inflate(R.layout.list_item,null);
         /****** View Holder Object to contain tabitem.xml file elements ******/
         holder = new ViewHolder();
         holder.layout1=(LinearLayout)convertView.findViewById(R.id.layout1);
         holder.checkBox=(CheckBox)convertView.findViewById(R.id.checkBox);
         holder.name = (TextView) convertView.findViewById(R.id.list_txtName);
         holder.tel=(TextView)convertView.findViewById(R.id.list_txtTel);
         holder.address=(TextView)convertView.findViewById(R.id.list_txtAddress);
         holder.rahn=(TextView) convertView.findViewById(R.id.list_txtRahn);
         holder.ejare=(TextView) convertView.findViewById(R.id.list_txtEjare);
         holder.image=(ImageView) convertView.findViewById(R.id.list_image);
         holder.foori=(TextView) convertView.findViewById(R.id.list_txtFoori);
         holder.date=(TextView) convertView.findViewById(R.id.list_txtDate);
         vi=convertView;
        /************  Set holder with LayoutInflater ************/
         convertView.setTag(holder);

     }
     else {
         holder = (ViewHolder) convertView.getTag();
         vi=convertView;
     }


     if(data.size()<=0)
     {
         holder.name.setText("no data");
         holder.address.setText("");

     }
     else
     {
         /***** Get each Model object from Arraylist ********/
         tempValues = ( ListModel ) data.get( position );
         /************  Set Model values in Holder elements ***********/
          holder.name.setText( tempValues.Name );
          holder.tel.setText( tempValues.Phone );
          holder.address.setText( tempValues.Address );
          holder.rahn.setText( tempValues.Rahn );
          holder.ejare.setText( tempValues.Ejare );
          holder.date.setText(tempValues.Date);

         holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                 if(b==true)
                     holder.layout1.setBackgroundColor(Color.argb(150,250,100,100));
                 else if(b==false) holder.layout1.setBackgroundColor(Color.TRANSPARENT);
             }
         });
          if(tempValues.foori==1)
              holder.foori.setVisibility(View.VISIBLE);


          if(tempValues.state==3){
              //holder.tblr.setBackgroundColor(Color.parseColor("#00ff00"));
              holder.name.setTextColor(Color.parseColor("#3C7700"));
              holder.tel.setTextColor(Color.parseColor("#2C6700"));
              holder.rahn.setTextColor(Color.parseColor("#397249"));
              holder.ejare.setTextColor(Color.parseColor("#92CD00"));
          }

          if(tempValues.isAzad==1){
              //holder.tblr.setBackgroundColor(Color.parseColor("#00ff00"));
              holder.name.setTextColor(Color.parseColor("#0000FF"));
              holder.tel.setTextColor(Color.parseColor("#0000FF"));
              holder.rahn.setTextColor(Color.parseColor("#0000FF"));
              holder.ejare.setTextColor(Color.parseColor("#0000FF"));
          } 

     }
     return convertView;
}

@Override
public void onClick(View arg0) {
    // TODO Auto-generated method stub
}

}

2 -

1 个答案:

答案 0 :(得分:1)

  

您仅实施了if案例,说明为什么没有实施else案例   它的发生是因为每次向上滚动时都会创建视图   所以定义其他也检查和颜色和维护   checkbox已选中int Array您必须在adapterif else   将他检查的状态保存在特定位置并放入OnItemClick   要检查的条件取消选中您的复选框。

     

您的checkbox无效,因为您正在使用ListView   focusable自定义行,因此解决方案集false xml   在自定义行的truelistview xml。{/ p>中的is:due      希望它会对你有所帮助。