Як выдаліць выбраныя элементы з ListView пры націсніце кнопку выдалення ў андроіды

Я адлюстравання імёнаў у спісе, са сцяжкамі, тут у мяне ёсць кнопка, калі я націскаю гэтую кнопку, што час, мне трэба, каб выдаліць выбраныя элементы і са спісу выгляд, застаюцца элементы толькі мне трэба паказаць у выглядзе спісу, выкарыстоўваючы ніжэй я кода я магу знайсці якія элементы я абраў, але я не ведаю, як выдаліць тыя, вы можаце прапанаваць любы з мяне

MainActivity.class: 
   public class MainActivity extends Activity {

 private ListView listview;  
 ArrayList items = new ArrayList();  
 private int count;  
 private boolean[] thumbnailsselection;  
 @Override  
 protected void onCreate(Bundle savedInstanceState) {  
      super.onCreate(savedInstanceState);  
      setContentView(R.layout.activity_main);  
      fillarray();  
      count = items.size();  
      thumbnailsselection = new boolean[count];  
      listview = (ListView) findViewById(R.id.listView1);  
      listview.setAdapter(new ImageAdapter(MainActivity.this));  
 }  
 private void fillarray() {  
     //TODO Auto-generated method stub  
      items.clear();  
      items.add("Android alpha");  
      items.add("Android beta");  
      items.add("1.5 Cupcake (API level 3)");  
      items.add("1.6 Donut (API level 4)");  
      items.add("2.0 Eclair (API level 5)");  
      items.add("2.0.1 Eclair (API level 6)");  

 }  
 @Override  
 public boolean onCreateOptionsMenu(Menu menu) {  
     //Inflate the menu; this adds items to the action bar if it is present.  
      getMenuInflater().inflate(R.menu.activity_main, menu);  
      return true;  
 }  
 public class ImageAdapter extends BaseAdapter {  
      private LayoutInflater mInflater;  
      private Context mContext;  
      public ImageAdapter(Context context) {  
           mContext = context;  
      }  
      public int getCount() {  
           return count;  
      }  
      public Object getItem(int position) {  
           return position;  
      }  
      public long getItemId(int position) {  
           return position;  
      }  
      public View getView(int position, View convertView, ViewGroup parent) {  
           ViewHolder holder;  
           if (convertView == null) {  
                holder = new ViewHolder();  
                convertView = LayoutInflater.from(mContext).inflate(  
                          R.layout.row_photo, null);  
                holder.textview = (TextView) convertView  
                          .findViewById(R.id.thumbImage);  
                holder.checkbox = (CheckBox) convertView  
                          .findViewById(R.id.itemCheckBox);  
                convertView.setTag(holder);  
           } else {  
                holder = (ViewHolder) convertView.getTag();  
           }  
           holder.checkbox.setId(position);  
           holder.textview.setId(position);  
           holder.checkbox.setOnClickListener(new OnClickListener() {  
                public void onClick(View v) {  
                    //TODO Auto-generated method stub  
                     CheckBox cb = (CheckBox) v;  
                     int id = cb.getId();  
                     if (thumbnailsselection[id]) {  
                          cb.setChecked(false);  
                          thumbnailsselection[id] = false;  
                     } else {  
                          cb.setChecked(true);  
                          thumbnailsselection[id] = true;  
                     }  
                }  
           });  
           holder.textview.setOnClickListener(new OnClickListener() {  
                public void onClick(View v) {  
                    //TODO Auto-generated method stub  
                     int id = v.getId();  
                }  
           });  
           holder.textview.setText(items.get(position));  
           holder.checkbox.setChecked(thumbnailsselection[position]);  
           holder.id = position;  
           return convertView;  
      }  

    public void removeItems()
      {
          notifyDataSetChanged();
      }
 }  
 class ViewHolder {  
      TextView textview;  
      CheckBox checkbox;  
      int id;  
 }  
 public void click(View v) {  
      if (v.getId() == R.id.button1) {  

           boolean noSelect = false;  

           for (int i = 0; i < thumbnailsselection.length; i++) {  
              if (thumbnailsselection[i] == true) {  
                   noSelect = true;  

                       items.remove(i);

                }  


         }  
          thumbnailsselection = new boolean[items.size()];
         adapter.removeItems(); 
      }  
 }  
}
0
ОК, так што проста захаваць гэтыя пазіцыі, якія вы выбіраеце ў масіве і ў залежнасці ад іх проста выдаліць элементы з асноўнага масіва
дададзена аўтар hardartcore, крыніца
Атрымаць код/​​становішча элемента, які вы хочаце выдаліць. Выдаліце ​​яго першы з вашага масіва array.remove (indexOfObjectWhichYouWantToRemove) і выклічце adapter.notifySetDataChanged() .
дададзена аўтар hardartcore, крыніца
гэты код будзе працаваць толькі ў тым выпадку, калі элементы ў thumbnailsselection і элементаў роўныя, як памер і ён выдаліць правільны аб'ект/прадмет.
дададзена аўтар hardartcore, крыніца
гэты код будзе працаваць толькі ў тым выпадку, калі элементы ў thumbnailsselection і элементаў роўныя, як памер і ён выдаліць правільны аб'ект/прадмет.
дададзена аўтар hardartcore, крыніца
ok..i хоча выдаліць некалькі выбраных элементаў адначасова, калі я націсніце кнопку Выдаліць
дададзена аўтар radha, крыніца
ок, thnks..can вы бачыце мой код кнопкі выдалення OnClick адзін раз, я зрабіў, як толькі што на
дададзена аўтар radha, крыніца
ок, thnks..can вы бачыце мой код кнопкі выдалення OnClick адзін раз, я зрабіў, як толькі што на
дададзена аўтар radha, крыніца

7 адказы

Паспрабуйце наступнае рашэнне

заявіць пра гэта перад тым OnCreate

ImageAdapter adapter;

ў вашым OnCreate змены

ImageAdapter adapter=new ImageAdapter(MainActivity.this);
listview.setAdapter(adapter);

Ўнутры вашага ImageAdapter дадайце наступны метад

public void removeItems()
{
    notifyDataSetChanged();
}

ў метадзе OnClick

for (int i = 0; i < thumbnailsselection.length; i++) {  
            if (thumbnailsselection[i] == true) {  
                 noSelect = true;  
                 Log.e("sel pos thu-->", "" + i);  
           //    posSel.add(i);  //
                     items.remove(i);
                //break;  
            }  
       }  
thumbnailsselection = new boolean[items.size()];
adapter.removeItems();
1
дададзена
аб'явіць гэта перад OnCreate адаптарам ImageAdapter; ў вашым OnCreate змяніць ImageAdapter адаптар = новы ImageAdapter (MainActivity.this) listview.setAdapter (адаптар); я не бачу гэта ў вашым кодзе
дададзена аўтар prvn, крыніца
removeItems() метад павінен быць унутры класа ImageAdapter
дададзена аўтар prvn, крыніца
дадаць - thumbnailsselection = новы фізічны [items.size ()]; Перад adapter.removeItems ();
дададзена аўтар prvn, крыніца
адлюстроўваецца ваш спіс?
дададзена аўтар prvn, крыніца
ды listdisplaying, калі абраць элементы з ListView, то я націскаю выдаліць button..that час я атрымліваю выключэнне NullPointer
дададзена аўтар radha, крыніца
я не выдаліць removeItems (), і я дадаў thumbnailsselection = новы фізічны [items.size ()]; перад тым adpater.removeItems() зараз таксама атрымлівае выключэнне NullPointer ў гэтай лініі adpater.removeItems ()
дададзена аўтар radha, крыніца
okey..then, дзе я павінен я павінен трымаць
дададзена аўтар radha, крыніца
прывітанне бачыць мой галоўнае пытанне пост я адрэдагаваны .... вось што калі-небудзь у сказаў змены, якія я зрабіў ... гэта правільна, інакш я зрабіў якія-небудзь памылкі адзін раз убачыць, калі ласка
дададзена аўтар radha, крыніца
хмм зрабіў, але цяпер праблема сэм
дададзена аўтар radha, крыніца
прывітанне, дзе я дадаць removwItems() я дадаў ўнутры класа imageadapter ... яго паказ мэтавага выкліку выключэнне
дададзена аўтар radha, крыніца
калі дадаць з боку imageadapter MENAS яго просяць стварыць mehod notifyDatachanged
дададзена аўтар radha, крыніца
java.lang.NullPointerException ўнутры на adapter.removeItems (); выдаліць радок
дададзена аўтар radha, крыніца

Паспрабуйце наступнае рашэнне

заявіць пра гэта перад тым OnCreate

ImageAdapter adapter;

ў вашым OnCreate змены

ImageAdapter adapter=new ImageAdapter(MainActivity.this);
listview.setAdapter(adapter);

Ўнутры вашага ImageAdapter дадайце наступны метад

public void removeItems()
{
    notifyDataSetChanged();
}

ў метадзе OnClick

for (int i = 0; i < thumbnailsselection.length; i++) {  
            if (thumbnailsselection[i] == true) {  
                 noSelect = true;  
                 Log.e("sel pos thu-->", "" + i);  
           //    posSel.add(i);  //
                     items.remove(i);
                //break;  
            }  
       }  
thumbnailsselection = new boolean[items.size()];
adapter.removeItems();
1
дададзена
аб'явіць гэта перад OnCreate адаптарам ImageAdapter; ў вашым OnCreate змяніць ImageAdapter адаптар = новы ImageAdapter (MainActivity.this) listview.setAdapter (адаптар); я не бачу гэта ў вашым кодзе
дададзена аўтар prvn, крыніца
дадаць - thumbnailsselection = новы фізічны [items.size ()]; Перад adapter.removeItems ();
дададзена аўтар prvn, крыніца
removeItems() метад павінен быць унутры класа ImageAdapter
дададзена аўтар prvn, крыніца
адлюстроўваецца ваш спіс?
дададзена аўтар prvn, крыніца
ды listdisplaying, калі абраць элементы з ListView, то я націскаю выдаліць button..that час я атрымліваю выключэнне NullPointer
дададзена аўтар radha, крыніца
okey..then, дзе я павінен я павінен трымаць
дададзена аўтар radha, крыніца
прывітанне, дзе я дадаць removwItems() я дадаў ўнутры класа imageadapter ... яго паказ мэтавага выкліку выключэнне
дададзена аўтар radha, крыніца
я не выдаліць removeItems (), і я дадаў thumbnailsselection = новы фізічны [items.size ()]; перад тым adpater.removeItems() зараз таксама атрымлівае выключэнне NullPointer ў гэтай лініі adpater.removeItems ()
дададзена аўтар radha, крыніца
прывітанне бачыць мой галоўнае пытанне пост я адрэдагаваны .... вось што калі-небудзь у сказаў змены, якія я зрабіў ... гэта правільна, інакш я зрабіў якія-небудзь памылкі адзін раз убачыць, калі ласка
дададзена аўтар radha, крыніца
хмм зрабіў, але цяпер праблема сэм
дададзена аўтар radha, крыніца
java.lang.NullPointerException ўнутры на adapter.removeItems (); выдаліць радок
дададзена аўтар radha, крыніца
калі дадаць з боку imageadapter MENAS яго просяць стварыць mehod notifyDatachanged
дададзена аўтар radha, крыніца
  1. Record the state of all CheckBox.

    • Data type SparseBooleanArray is better than boolean[] here.
    • Initialize thumbnailsselection in ImageAdapter constructer, and modify its values in checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {}).

    // Initialize

    for (int i = 0; i < itemCount; i++)
        thumbnailsselection.put(i, false);
    

    // Modify

    holder.checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            int position = buttonView.getId();
            thumbnailsselection.put(position, isChecked);
        }
    });
    
  2. Remove items from back to front, one by one, because the deletion only affects indices of items behind the removed one.

    for (int i = itemCount - 1; i >= 0; i--) {
        position = thumbnailsselection.keyAt(i);
        isChecked = thumbnailsselection.get(position, false);
    
        if (!isChecked)
            continue;
    
        if (position < items.size())
            items.remove(position);
    }
    
  3. Show new data.

    imageAdapter.notifyDataSetChanged();
    
1
дададзена

Я крыху зьбянтэжаны, таму што я не думаю, што ваш адаптар паказвае, што вы хочаце яшчэ да выдалення з-за гэтага:

public int getCount() {  
           return count;  
}  
public Object getItem(int position) {  
      return position;  
}  

Пасля таго, як адаптар будзе правільна усталяваны з масівам дадзеных для адлюстравання (у вашым выпадку элементы я думаю) вы проста павінны выдаліць аб'екты, якія вы хочаце выдаліць з гэтага масіва ( items.remove ( аб'ект) ), а затым выклікаць notifyDataSetChanged() на адаптары.

змяніць:

Я думаю, што ёсць некаторыя лагічныя праблемы ў кодзе тут. Я мяркую, што вы хочаце адлюстроўваць дадзеныя з элемента Масіў , так што вы павінны, верагодна, распаўсюджваецца ArrayAdapter замест BaseAdapter . Далей я думаю, што існуе блытаніна паміж элементам і становішчам элемента. Класічная рэалізацыя GetItem() гэта, для масіваў, нешта накшталт:

public Object getItem(int position) {  
      return array.get(position);  
}

Можа быць, я зусім няправільна, але я думаю, вы павінны спачатку ачысціць свой код, каб адпавядаць менавіта вашым патрэбам, і тады гэта будзе даволі лёгка дамагчыся таго, што вы хочаце.

0
дададзена
<�Код> OBJ гэта радок, якую wan't выдаліць з спісу
дададзена аўтар FabiF, крыніца
@radha, я рэдагаваць свой пост, я думаю, вы павінны думаць пра іншую рэалізацыі адаптара.
дададзена аўтар FabiF, крыніца
для (INT i1 = 0; i1
дададзена аўтар radha, крыніца
вось што OBJ, мне трэба напісаць выдаляць элементы кода кнопкі выдалення OnClick() толькі
дададзена аўтар radha, крыніца
выбраныя элементы я захоўваю ў адным ArrayList то я выдаліў, выкарыстоўваючы ніжэй
дададзена аўтар radha, крыніца
possel arrylist незалежна я падбіраю значэнне захоўвае
дададзена аўтар radha, крыніца
ок, Thnks, я буду старацца вырашыць
дададзена аўтар radha, крыніца

Я крыху зьбянтэжаны, таму што я не думаю, што ваш адаптар паказвае, што вы хочаце яшчэ да выдалення з-за гэтага:

public int getCount() {  
           return count;  
}  
public Object getItem(int position) {  
      return position;  
}  

Пасля таго, як адаптар будзе правільна усталяваны з масівам дадзеных для адлюстравання (у вашым выпадку элементы я думаю) вы проста павінны выдаліць аб'екты, якія вы хочаце выдаліць з гэтага масіва ( items.remove ( аб'ект) ), а затым выклікаць notifyDataSetChanged() на адаптары.

змяніць:

Я думаю, што ёсць некаторыя лагічныя праблемы ў кодзе тут. Я мяркую, што вы хочаце адлюстроўваць дадзеныя з элемента Масіў , так што вы павінны, верагодна, распаўсюджваецца ArrayAdapter замест BaseAdapter . Далей я думаю, што існуе блытаніна паміж элементам і становішчам элемента. Класічная рэалізацыя GetItem() гэта, для масіваў, нешта накшталт:

public Object getItem(int position) {  
      return array.get(position);  
}

Можа быць, я зусім няправільна, але я думаю, вы павінны спачатку ачысціць свой код, каб адпавядаць менавіта вашым патрэбам, і тады гэта будзе даволі лёгка дамагчыся таго, што вы хочаце.

0
дададзена
@radha, я рэдагаваць свой пост, я думаю, вы павінны думаць пра іншую рэалізацыі адаптара.
дададзена аўтар FabiF, крыніца
<�Код> OBJ гэта радок, якую wan't выдаліць з спісу
дададзена аўтар FabiF, крыніца
вось што OBJ, мне трэба напісаць выдаляць элементы кода кнопкі выдалення OnClick() толькі
дададзена аўтар radha, крыніца
выбраныя элементы я захоўваю ў адным ArrayList то я выдаліў, выкарыстоўваючы ніжэй
дададзена аўтар radha, крыніца
для (INT i1 = 0; i1
дададзена аўтар radha, крыніца
possel arrylist незалежна я падбіраю значэнне захоўвае
дададзена аўтар radha, крыніца
ок, Thnks, я буду старацца вырашыць
дададзена аўтар radha, крыніца

Вы можаце паспрабаваць ніжэй код і запісаць яго ў кнопку мышы падзеі

        SparseBooleanArray checked = keywordsList.getCheckedItemPositions();

        ArrayList selectedKeywords = new ArrayList();
        for (int i = 0; i < checked.size(); i++) {
            int position = checked.keyAt(i);
            if (checked.valueAt(i))
                selectedKeywords.add(keywordsAdapter.getItem(position));
        }

        for (int i = 0; i < selectedKeywords.size(); i++) {
            keywordsAdapter.remove(selectedKeywords.get(i));
        }

        keywordsAdapter.notifyDataSetChanged();

Вось мой код адаптара, як гэта

        keywordsAdapter = new ArrayAdapter(
                            IncidentEditActivity.this,
                            android.R.layout.simple_list_item_multiple_choice,
                            arrKeywords);
        keywordsList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        keywordsList.setAdapter(keywordsAdapter);
0
дададзена

Вы можаце паспрабаваць ніжэй код і запісаць яго ў кнопку мышы падзеі

        SparseBooleanArray checked = keywordsList.getCheckedItemPositions();

        ArrayList selectedKeywords = new ArrayList();
        for (int i = 0; i < checked.size(); i++) {
            int position = checked.keyAt(i);
            if (checked.valueAt(i))
                selectedKeywords.add(keywordsAdapter.getItem(position));
        }

        for (int i = 0; i < selectedKeywords.size(); i++) {
            keywordsAdapter.remove(selectedKeywords.get(i));
        }

        keywordsAdapter.notifyDataSetChanged();

Вось мой код адаптара, як гэта

        keywordsAdapter = new ArrayAdapter(
                            IncidentEditActivity.this,
                            android.R.layout.simple_list_item_multiple_choice,
                            arrKeywords);
        keywordsList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        keywordsList.setAdapter(keywordsAdapter);
0
дададзена