滚动时更改Arrayadaper选定的网格

时间:2014-08-11 10:30:42

标签: android android-layout

这是我的代码gridview使用arrayadapter,这是getview部分

public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;

if (convertView == null) {
    holder = new ViewHolder();
    convertView = LayoutInflater.from(context).inflate(R.layout.children_row_grid, null);
    holder.text_child_name = (TextView) convertView.findViewById(R.id.children_name);
    holder.img_child_view = (ImageView) convertView.findViewById(R.id.image_children);
    holder.text_child_month = (TextView) convertView.findViewById(R.id.text_children_month);
    holder.layout_selected = (RelativeLayout) convertView.findViewById(R.id.layout_children_selected);

    Resources r = getResources();
    float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150, r.getDisplayMetrics());
    int pixel_height = (int) pixels;
    /*
     * getting month value from the data of birth
     * */
    String dob = children_list.get(position).getDate_of_birth();
    Date child_birthday = null;
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

    dob = dob.replace("-", "/");
    new ParsePosition(0);
    try {
        child_birthday = (Date) dateFormat.parse(dob);
    } catch (java.text.ParseException e) {
        e.printStackTrace();
    }

    holder.layout_selected.setId(children_list.get(position).getChild_id());
    holder.img_child_view.setId(children_list.get(position).getChild_id());
    display_month = Utill.getAgeinMonths(child_birthday);

    holder.img_child_view.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, pixel_height));
    holder.img_child_view.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            Toast.makeText(getApplicationContext(), "imcge clicked", Toast.LENGTH_SHORT).show();
            children_count++;
            text_children_count.setText("" + children_count);

            //System.out.println("checking...."+intList.contains(v.getId()));
            System.out.println("size of array:::" + intList.size());
            if (intList.contains(v.getId())) {
                System.out.println("yes");
                System.out.println("..." + intList.contains(v.getId()));
                Integer val = v.getId();
                intList.remove(val);
                holder.layout_selected.setVisibility(View.INVISIBLE);
            } else {
                intList.add(v.getId());
                System.out.println("no");
                System.out.println("..." + intList.contains(v.getId()));
                holder.layout_selected.setVisibility(View.VISIBLE);
            }
            for (Integer value: intList) {
                System.out.println("Value = " + value);
            }
        }
    });
    convertView.setTag(holder);
} else {
    holder = (ViewHolder) convertView.getTag();
}

String grname = children_list.get(position).getGroup_name();

if (grname == null) {
    grname = "";
}
holder.text_child_name.setText(children_list.get(position).getFirst_name());
holder.text_child_month.setText(display_month + "," + grname);
Bitmap bitmap = decodeFile(new File(Environment.getExternalStorageDirectory() + "/com.x/unChildren/" + children_list.get(position).getPhoto()), ConfigurationData.staffImageSize, ConfigurationData.staffImageSize);
holder.img_child_view.setImageBitmap(bitmap);

return convertView;

}
}

问题:当我选择网格时,我在相对布局中添加了图像视图,工作正常,这里当我滚动网格视图时,选定的网格被更改

3 个答案:

答案 0 :(得分:1)

回收视图时:

convertView != null

在这一部分:

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

您仍然需要测试条件并替换视图中的图像(如果它们已更改)。非null convertView并不意味着它具有您期望的内容,它只是意味着处理器不必重建布局。

换句话说,您可能需要在该部分代码中重置图像,替换onClick侦听器等。

答案 1 :(得分:1)

只需删除此

即可
if (convertView == null)

答案 2 :(得分:0)

试试这个:

 public View getView(final int position, View convertView,ViewGroup parent) {
            final ViewHolder holder;

            if(convertView == null){
                holder=new ViewHolder();
                convertView = LayoutInflater.from(context)
                        .inflate(R.layout.children_row_grid, null);
                holder.text_child_name=(TextView)convertView.findViewById(R.id.children_name);
                holder.img_child_view=(ImageView)convertView.findViewById(R.id.image_children);
                holder.text_child_month=(TextView)convertView.findViewById(R.id.text_children_month);
                holder.layout_selected=(RelativeLayout)convertView.findViewById(R.id.layout_children_selected);

                Resources r = getResources();
                float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150, r.getDisplayMetrics());
                int pixel_height = (int) pixels;
                /*
                 * getting month value from the data of birth
                 * */
                String dob=children_list.get(position).getDate_of_birth();  
                Date child_birthday = null;
                SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

                dob = dob.replace("-", "/");
                new ParsePosition(0);
                try {
                child_birthday = (Date) dateFormat
                .parse(dob);
                } catch (java.text.ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();            

                }



                display_month=XUtill.getAgeinMonths(child_birthday);                

                holder.img_child_view.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT , pixel_height));                          
                convertView.setTag(holder);
            }else{
                holder=(ViewHolder)convertView.getTag();
            }
            holder.layout_selected.setId(children_list.get(position).getChild_id());
            holder.img_child_view.setId(children_list.get(position).getChild_id());
            holder.img_child_view.setOnClickListener(new OnClickListener() {


                @Override
                public void onClick(View v) {

                    Toast.makeText(getApplicationContext(), "imcge clicked", Toast.LENGTH_SHORT).show();
                    children_count++;
                    text_children_count.setText(""+children_count);                 



                    //System.out.println("checking...."+intList.contains(v.getId()));
                    System.out.println("size of array:::"+intList.size());

                    if(intList.contains(v.getId())){
                        System.out.println("yes");
                        System.out.println("..."+intList.contains(v.getId()));
                        Integer val=v.getId();
                        intList.remove(val);
                        holder.layout_selected.setVisibility(View.INVISIBLE);

                    }else{
                        intList.add(v.getId());
                        System.out.println("no");
                        System.out.println("..."+intList.contains(v.getId()));
                        holder.layout_selected.setVisibility(View.VISIBLE);
                    }




                }
            });

            if(intList.contains(holder.layout_selected.getId())){


                holder.layout_selected.setVisibility(android.view.View.VISIBLE);

            }else{

                holder.layout_selected.setVisibility(android.view.View.INVISIBLE);
            }
            String grname=children_list.get(position).getGroup_name();

            if(grname==null)
            {
                grname="";
            }

            holder.text_child_name.setText(children_list.get(position).getFirst_name());
            holder.text_child_month.setText(display_month+","+grname);
            Bitmap bitmap = decodeFile(new File( Environment.getExternalStorageDirectory()+"/com.x/y/"+children_list.get(position).getPhoto()), ConfigurationData.staffImageSize,ConfigurationData.staffImageSize);
            holder.img_child_view.setImageBitmap(bitmap);

            return convertView;

        }

的变化:

  1. 在if(convertView == null)之后的布局和视图的SetId()以及其他部分

  2. 将onclicklistener更改为if之后(convertView == null)和其他部分

  3. 使用以下代码:

    如果(intList.contains(holder.layout_selected.getId())){

                    holder.layout_selected.setVisibility(android.view.View.VISIBLE);
    
                }else{
    
                    holder.layout_selected.setVisibility(android.view.View.INVISIBLE);
                }