2015-03-12 7 views
2

Я показываю несколько изображений в gridview с прикрепленным к нему флажком. multiple images. Мое требование - всякий раз, когда я проверю флажок, что конкретное представление должно быть удалено из gridview, и мое gridview должно быть обновлено с остальным набором изображений.Обновление GridView в android

Например, если я проверяю второй элемент gridView, этот конкретный элемент должен быть полностью удален из сетки, а оставшиеся изображения должны быть перегруппированы в gridview. т. е. 3-й элемент должен выйти на 2-ю позицию, а 4-й элемент должен прийти к 3-му положению. second modification

Снова Если я проверяю третий элемент обновленного gridView, этот конкретный элемент должен быть полностью удален из gridview, а оставшиеся изображения должны быть перегруппированы в gridview. third ![modification][3] ExistingDetailedActivity.java

public class ExistingDetailedActivity extends Activity { 
public String images,audiopath,name; 
TextView ringtonename; 
public GridView gridView; 
public String [] imgpath; 
CustomBaseExistAdapter adapter; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_existing_detailed); 
    Intent i = getIntent(); 

    if(i.hasExtra("BNDL")){ 
     Bundle bdl = getIntent().getBundleExtra("BNDL"); 

     if(bdl.get("IMAGEPATH") != null){ 
      images = bdl.getString("IMAGEPATH"); 
     } 

     if(bdl.get("AUDIOPATH") != null){ 
      audiopath = bdl.getString("AUDIOPATH"); 
     } 
     if(bdl.get("RINGTONENAME") != null){ 
      name = bdl.getString("RINGTONENAME"); 
     } 
    } 
    imgpath=images.split("\\*") ; 
    ringtonename=(TextView) findViewById(R.id.textView2); 
    ringtonename.setText(name); 
    gridView=(GridView) findViewById(R.id.gridview1); 
    //CustomExistingListAdapter adapter = new CustomExistingListAdapter(this,imgpath); 
    //CustomBaseExistAdapter adapter = new CustomBaseExistAdapter(this,imgpath); 
    adapter = new CustomBaseExistAdapter(this,imgpath); 
    gridView.setAdapter(adapter); 
    //adapter.notifyDataSetChanged(); 

} 

} 

CustomBaseExistAdapter.java

public class CustomBaseExistAdapter extends BaseAdapter{ 

private final Activity context; 
private final String[] imagepath; 
private String[] imagepath1=null; 
private String[] imagepath2=null; 
private String[] imagepath3=null; 
public CustomBaseExistAdapter(Activity context, 
String[] imagepath) { 
this.context = context; 
this.imagepath = imagepath; 

List<String> nonBlank = new ArrayList<String>(); 
for(String s: imagepath) { 
    if (!s.trim().isEmpty()) { 
     nonBlank.add(s); 
    } 
} 
//nonBlank will have all the elements which contain some characters. 
imagepath1 = (String[]) nonBlank.toArray(new String[nonBlank.size()]); 
imagepath2 = (String[]) nonBlank.toArray(new String[nonBlank.size()]); 
//notifyDataSetChanged(); 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return imagepath.length; 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    convertView = null; 

     if (convertView == null) { 

      LayoutInflater mInflater = (LayoutInflater) context 
        .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
      convertView = mInflater.inflate(R.layout.custom_image_with_checkbox, null); 
      CheckBox cb=(CheckBox) convertView.findViewById(R.id.checkBox1); 
      final ImageView imageView = (ImageView) convertView.findViewById(R.id.imgThumb); 

      cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        // TODO Auto-generated method stub 
        int id = buttonView.getId(); 
        if(isChecked){ 


         List<String> list = new ArrayList<String>(Arrays.asList(imagepath1)); 
         list.remove(imagepath1[position]); 
         imagepath3 = list.toArray(new String[0]); 
         ////////////////////////////////// 
         List<String> nonBlank1 = new ArrayList<String>(); 
         for(String s: imagepath3) { 
          if (!s.trim().isEmpty()) { 
           nonBlank1.add(s); 
          } 
         } 
         imagepath2=null; 
         //nonBlank will have all the elements which contain some characters. 
         imagepath2 = (String[]) nonBlank1.toArray(new String[nonBlank1.size()]); 
         //imageView.setImageBitmap(BitmapFactory.decodeFile(null)); 
         notifyDataSetChanged(); 

        } 

       } 

      }); 


      imageView.setImageBitmap(BitmapFactory.decodeFile(imagepath2[position]));  

     } 
    return convertView; 
} 

ответ

2

Есть много вещей неправильно с вашей логикой. Как правило, для обновления сетки следует использовать на UI основного потока следующее:

adapter.notifyDataChanged(); 

и somethimes также:

grid.invalidateViews(); 

Но ваша проблема в том, что на флажке изменена вы не обновляя данные в вашем источнике данных, который, как представляется, является imagePath [], когда вы передаете его конструктору, а также используете его в методе getCount() для извлечения счета.

Итак, вы должны удалить элемент из этого источника данных, если хотите обновить сетку.

Если вы хотите сохранить все [] данные ImagePath, имеют еще одну переменную для резервного копирования:

private String[] imagepathBackUp=null; 

public CustomBaseExistAdapter(Activity context, 
String[] imagepath) { 
this.context = context; 
this.imagepath = imagepath; 

this.imagepathBackUp =imagepath; 

List<String> nonBlank = new ArrayList<String>(); 
for(String s: imagepath) { 
    if (!s.trim().isEmpty()) { 
     nonBlank.add(s); 
    } 
} 

, а затем удалить его из ImagePath так:

@Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        // TODO Auto-generated method stub 
        int id = buttonView.getId(); 
        if(isChecked){ 


         List<String> list = new ArrayList<String>(Arrays.asList(imagepath1)); 
         list.remove(imagepath1[position]); 
         imagepath3 = list.toArray(new String[0]); 
         ////////////////////////////////// 
         List<String> nonBlank1 = new ArrayList<String>(); 
         for(String s: imagepath3) { 
          if (!s.trim().isEmpty()) { 
           nonBlank1.add(s); 
          } 
         } 
         imagepath2=null; 
         //nonBlank will have all the elements which contain some characters. 
         imagepath2 = (String[]) nonBlank1.toArray(new String[nonBlank1.size()]); 
                //imageView.setImageBitmap(BitmapFactory.decodeFile(null)); 

        /// REMOVE item from itemPath[], something like this: 


        String newList[] = new String[itemPath.length - 1]; 
        int count = 0; 
        for (int i = 0; i < itemPath.length; i++) { 
          if (itemPath.length - 1 > 0) { 
           if (itemPath[i] == imagepath1[position]) { // itemPath[1] as the range starts from 0, so 1 would be ITEM2 
           // SKIP IF MATCHES THE ITEM YO WANT TO REMOVE      
           } else { 
            newList[count] = itemPath[i]; 
            count++; 
            } 
           } 
          } 
         itemPath= newList; 

         notifyDataSetChanged(); 

        } 

проверить эту ссылку в ну, это именно то, что вам нужно:

Android - Remove GridView item from inside getView()?

EDIT:

Вместо того, чтобы использовать массив, чтобы удалить, это может быть лучше использовать список, как я вижу, ты previuosly сделал:

List<String> newlist = new ArrayList<String>(Arrays.asList(itemPath));   
newlist.remove(imagepath1[position]);   
itemPath = newlist.toArray(new String[newlist.size()]); 

Кроме того, проверьте, что imagepath1 [положение] не будет бросаться исключение, так что positionpath1.lenght> position.

+0

очень хороший ответ sir.but иногда его отображение arrayindexoutofboundexception –

+1

Я отредактировал мой ответ. –

+0

yup .by, используя концепцию проблемы ArrayList. –

Смежные вопросы