2013-07-20 4 views
0

Мне нужен способ удалить элемент из GridView, но это должно быть сделано из метода getView() внутри моего адаптера. Вот мой GridView:Android - Удалить элемент GridView изнутри getView()?

активности:

... 
    String[] newList; 
    newList[0] = "Item 1"; 
    newList[1] = "Item 2"; 
    newList[2] = "Item 3"; 
    ... 
    GridView GV = (GridView) getActivity().findViewById(R.id.gv); 
    GV.setAdapter(new Adapter(getActivity(), newList)); 
    GV.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView arg0, 
      View arg1, int position, long arg3) { 
      ... 
     } 
    }); 

адаптер

public class Adapter extends BaseAdapter { 

    private Context mContext; 
    private LayoutInflater mInflator; 
    private String mEntries[]; 

    public static class ViewHolder { 
     public TextView myTextView; 
    } 

    public Adapter (Context context, String[] entries) { 
     mContext = context; 
     mInflator = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     mEntries = entries; 
    } 

    @Override 
    public int getCount() { 
     return mEntries.length; 
    } 

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

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     ViewHolder holder = null; 
     if(convertView == null) { 
      convertView = mInflator.inflate(R.layout.gvitemlayout, parent, false); 
      holder = new ViewHolder(); 
      holder.myTextView = (TextView) convertView.findViewById(R.list.removeItem); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     String string = mEntries[position]; 
     String[] data = string.split("\\."); 

     if (data.length < 2) { 
      TextView itemName = (TextView) convertView.findViewById(R.list.itemName); 
      itemName.setText(""); 
      TextView itemClass = (TextView) convertView.findViewById(R.favlist.itemClass); 
      itemClass.setText(""); 
      holder.myTextView.setText(""); 
      TextView itemNone = (TextView) convertView.findViewById(R.list.itemNone); 
      itemNone.setText("No Items"); 
     } else { 
      TextView itemName = (TextView) convertView.findViewById(R.list.itemName); 
      itemName.setText(data[1]); 
      TextView itemClass = (TextView) convertView.findViewById(R.list.itemClass); 
      itemClass.setText(data[0]); 
     } 

     final int info = (Integer) getItem(position); 
     holder.myTextView.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) {    
       SharedPreferences sP = mContext.getSharedPreferences("fav", mContext.MODE_PRIVATE); 
       Boolean b = sP.getBoolean(mEntries[info], false); 
       if (b == true) { 
        SharedPreferences.Editor editor = sP.edit(); 
        editor.remove(mEntries[info]); 
        editor.commit(); 

        // REMOVE ITEM CODE NEEDED HERE 

       } 
      } 
     }); 
     return convertView; 
    } 
} 

Надеется, что это делает его легче понять, что мне нужно.

ответ

1

Это то, что я сделал, не нужно было инициализировать переменную «адаптер». Внутри getView() просто выполните следующие действия:

  1. Удалить элемент из списка, который использовался в качестве источника данных.

So. если вы хотите удалить пункт 2 из списка

String mEntries[] = ITEM1, ITEM2, ITEM3, etc

ли это:

String newList[] = new String[mEntries.length - 1]; 
int count = 0; 
for (int i = 0; i < mEntries.length; i++) { 
    if (mEntries.length - 1 > 0) { 
     if (mEntries[i] == mEntries[1]) { // mEntries[1] as the range starts from 0, so 1 would be ITEM2 
      // SKIP IF MATCHES THE ITEM YO WANT TO REMOVE      
     } else { 
      newList[count] = mEntries[i]; 
      count++; 
     } 
    } 
} 
mEntries = newList; // save the new list into mEntries 
notifyDataSetChanged(); // notify the changes and the listview/gridview will update 
+0

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

0

То, о чем вы просите, очень возможно. Вы не дали достаточно кода для того, чтобы было ясно, что именно происходит, но код, выше которого вы выложили, не будет работать, если кнопка удаления не будет полностью отображена getView в адаптере.

Вашего GetView в адаптере нужен будет выглядеть примерно так:

public View getView(final int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.grid_view_item, null); 
     } 

     Button removeButton = (Button) convertView.findViewById(R.id.remove_button); 
     removeButton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       adapter.mThumbIdsList.remove(position); 
       adapter.notifyDataSetChanged(); 
      } 
     }); 

     return convertView; 
    } 

Надеется, что это помогает. Удачи!

+0

код я вставил не мой код, я нашел его на StackOverflow. Мне нужно знать, что происходит внутри onClick. Как удалить элемент с помощью 'int position'? У меня есть GridView gv = (GridView) convertView.findViewById (R.id.grid); 'внутри my onClick, что дальше? –

+0

Вы не удаляете дочерний вид из GridView. Вы удаляете элемент из любого набора данных вашего адаптера и вызываете 'notifyDataSetChanged()' на адаптере. Не видя никакого кода, это лучшее объяснение, которое мы можем вам дать. – Karakuri

+0

@ Extremis мой ответ правильно отвечает на это. В методе getView вашего адаптера, который подает представления в ваш GridView, когда нажата кнопка «Удалить вид», это позиция, которую вы хотите удалить. Обратите внимание, как в сигнатуре метода я объявляю позицию как окончательную, а затем в прослушивателе кликов я использую позицию для удаления данных, которые необходимо удалить, и перерисуйте Grid. Вот как вы это делаете, однако, очевидно, вам придется адаптировать этот код для вашего собственного использования. Я предположил, что данные, поддерживающие ваш адаптер, были фактически адаптером.mTumIdsList. – spierce7

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