Как удалить флажки из списка - PullRequest
4 голосов
/ 26 января 2012

У меня 50 пунктов в списке. Теперь я проверил 10 пунктов, так как этот 10 отмеченный элемент удаляется (удаляется) из списка, когда я нажимаю кнопку удаления.

Вот мой код

Пожалуйста, смотрите мой код и ответ, где ошибка :

public class BookmarksJokes extends Activity implements OnClickListener,
    OnItemClickListener {
ListView lv;
Button btn_delete;
public String TAG = "horror";
private SQLiteDatabase db;
public static final String PREFS_NAME = "MyPreferences";
static String[] tempTitle = new String[100];
static String[] tempBody = new String[100];
private static boolean bRequiresResponse;

private static class EfficientAdapter extends BaseAdapter {
    private LayoutInflater mInflater;

    public EfficientAdapter(Context context) {
        mInflater = LayoutInflater.from(context);

    }
    public int getCount() {
        return tempTitle.length;
    }

    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) {
            convertView = mInflater.inflate(R.layout.bookmarks_list_item,
                    null);
            holder = new ViewHolder();
            holder.text1 = (TextView) convertView
                    .findViewById(R.id.title);
            holder.text2 = (TextView) convertView
                    .findViewById(R.id.body);
             holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);

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

        holder.text1.setText(tempTitle[position]);
        holder.text2.setText(tempBody[position]);
        // bRequiresResponse = checkBox.isChecked();
        return convertView;
    }

    static class ViewHolder {
        TextView text1;
        TextView text2;
        CheckBox checkBox;
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.bokmarksjoks);

    try {
        db = (new DatabaseHelper(this)).getWritableDatabase();
    } catch (IOException e) {
        e.printStackTrace();
    }
    setUpViews();

    title = (TextView) findViewById(R.id.body);
    SharedPreferences pref = getSharedPreferences(PREFS_NAME, 0);

    //String ids = pref.getString("jid", "");
    String one = pref.getString("title", "");
    String two = pref.getString("body", "");

    tempTitle = one.split(",");
    tempBody = two.split(",");
    lv.setAdapter(new EfficientAdapter(this));
}

private void setUpViews() {
    lv = (ListView) findViewById(R.id.list);
    btn_delete = (Button) findViewById(R.id.delete);
    btn_delete.setOnClickListener(this);
    // checkbox = (CheckBox) findViewById(R.id.checkbox);

}
private void removeData(){
//int pos= getIntent().getIntExtra("POSITION", 0);
//lv.removeViewAt(pos);
// notifyAll();*/
//  int pos= getIntent().getIntExtra("POSITION", 0);
//  if(checkBox.isChecked()){
//      Log.d(TAG, " checked d]"+pos);
//      Toast.makeText(this, "checked "+pos, Toast.LENGTH_SHORT).show();
//  }
}
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.delete:
        AlertDialog.Builder alt_bld = new AlertDialog.Builder(this);
        alt_bld.setMessage("Are you Sure want to delete all checked jok ?")
                .setCancelable(false)
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int id) {
                                //removeJok();

                            }
                        })
                .setNegativeButton("No",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int id) {
                                dialog.cancel();
                            }
                        });
        AlertDialog alert = alt_bld.create();
        alert.setTitle("Delete Jokes");
        alert.show();
    case R.id.checkbox:

    default:
        break;
    }

}

public void onItemClick(AdapterView<?> arg0, View view, int position,
        long ids) {

    try {

    //   checkBox = (CheckBox)view.findViewById(R.id.checkbox);
    //   checkBox.setChecked(true);

        Intent intent = new Intent(BookmarksJokes.this,
                BookmarkJokesDetails.class);

        intent.putExtra("POSITION", position);
        intent.putExtra("ID", ids);
        Cursor cursor = (Cursor) adapter.getItem(position);

        intent.putExtra("_ID",
                cursor.getInt(cursor.getColumnIndex("_id")));

        startActivity(intent);
    } catch (Exception e) {
        e.printStackTrace();
    }

    Toast.makeText(BookmarksJokes.this,
            "Item in position " + position + " clicked", Toast.LENGTH_LONG)
            .show();
}
}

Вот мой полный код:

http://pastebin.com/LB2WKHMP

Ответы [ 6 ]

10 голосов
/ 03 февраля 2012

Я выполнил ту же задачу в одном из моих приложений.

Что вам нужно сделать, это использовать ArrayList того же размера, что и элемент списка, и каждый элемент по умолчанию содержит 0.Теперь в вашем эффективном адаптере для каждого установленного флажка присвойте 1 в этой конкретной позиции в arrayList.Наконец, по нажатию кнопки удаления, просмотрите ArrayList и удалите все те элементы из списка, которые содержат 1 в этой позиции в этом ArrayList, и вызов atLast notifyDatasetChanged () для метода списка , так что список обновляется и показываетновый список.

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

 ArrayList<Integer> checks=new ArrayList<Integer>();

Теперь в методе onCreate

for(int b=0;b<tempTitle.length;b++){
    checks.add(b,0);  //assign 0 by default in each position of ArrayList
        } 

Теперь в методе getView вашего эффективного адаптера

 public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.bookmarks_list_item,
                    null);
            holder = new ViewHolder();
            holder.text1 = (TextView) convertView
                    .findViewById(R.id.title);
            holder.text2 = (TextView) convertView
                    .findViewById(R.id.body);
             holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);

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

           holder.checkBox.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub

                if(((CheckBox)v).isChecked()){
                  checks.set(position, 1);
                }
                else{
                 checks.set(position, 0);
                }

            }
        });


        return convertView;
    }

Наконец, при удалении Нажмите кнопку:

     delete.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {
    // TODO Auto-generated method stub

          for(int i=0;i<checks.size();i++){

    if(checks.get(i)==1){
          //remove items from the list here for example from ArryList 
          checks.remove(i);
           //similarly remove other items from the list from that particular postion
           i--;
        }
     }
    ((EfficientAdapter)lv.getAdapter()).notifyDataSetChanged();
  }
}

Надеюсь, это решит вашу проблему.

4 голосов
/ 26 января 2012

Я предполагаю, что получил идентификаторы, которые выбраны. теперь просто arrayList.remove (position); а также вызов notifyDataSetChanged ();

2 голосов
/ 29 января 2012

человек, в вашем коде отсутствует связь между флажком и объектом, а также вы не реализовали onCheckedchangeListener внутри своего адаптера .... вот что вам нужно http://www.vogella.de/articles/AndroidListView/article.html#listadvanced_interactive Или Я заверну это для вас :

  1. вам необходимо создать класс model.java, который представляет ячейку списка следующим образом:

    public class Model {
         private String title;
         private String body;
         private boolean isSelected;
    
         public Model(String title, String body) {
              this.title = title;
              this.body = body;
              this.isSelected = false;
         }
    
         // here you MUST create your set of setters and getters.
    }
    
  2. изменить ваш адаптер для расширения ArrayAdapter<Model>

  3. изменить конструктор адаптера, чтобы он был

    private Model[] model;
    public EfficientAdapter(Context context, Model model) {
    
         mInflater = LayoutInflater.from(context);
         this.model = model;
    
    }
    
  4. тогда вам нужно добавить onCheckedChangeListener внутри адаптера внутри метода getView, чтобы ваш метод getView выглядел так:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = null;
        if (convertView == null) {
            LayoutInflater inflator = context.getLayoutInflater();
    
            final ViewHolder viewHolder = new ViewHolder();
            viewHolder.text1 = (TextView) convertView.findViewById(R.id.title);
            viewHolder.text2 = (TextView) convertView.findViewById(R.id.body);
            viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);
            viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    
                @Override
                public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
    
                    Model element = (Model) viewHolder.checkbox.getTag();
    
                    element.setSelected(buttonView.isChecked());
                }
            });
            view.setTag(viewHolder);
            viewHolder.checkbox.setTag(list[position]);
        } else {
            view = convertView;
            ((ViewHolder) view.getTag()).checkbox.setTag(list[position]);
        }
    
        ViewHolder holder = (ViewHolder) view.getTag();
        holder.text1.setText(tempTitle[position]);
        holder.text2.setText(tempBody[position]);
        return view;
    }
    
  5. , затем создайте массив моделей внутри вашей деятельности и передайте его адаптеру.

  6. Последнее, что нужно сделать, это удалить выбранные элементы из списка:

    final ArrayList<Model> newModel = new ArrayList<Model>();
    
    for (int i = 0; i < model.length/*this is the original model*/; i++) {
    
        if(model[i].isChecked()){
    
            // fill the array list ...
            newModel.add(model[i]);
        }
    }
    
  7. и все, передайте newModel адаптеру и поместите адаптер в список.

шаг № 7 также можно выполнить, заполнив модель (исходную, которая первоначально передается в массив), а затем вызовите notifyDataSetChanged() с помощью адаптера.

это все, и это то, что всегда работало для меня ... надеюсь, это поможет и вам.

0 голосов
/ 12 декабря 2012

Обновите просмотр списка еще раз, когда вы установили флажок и нажали кнопку удаления.Означает, что вы должны снова установить адаптер на представление списка после того, как элементы были удалены.Спасибо

0 голосов
/ 31 января 2012

Я думаю, что ваша проблема не требует большого количества кода. Вам нужна просто концепция. Ответ, приведенный выше, - лучший способ сделать это.

I am assuming i got ids which are selected. now simply arrayList.remove(position);
and call notifyDataSetChanged();

В качестве дочернего элемента представления списка (CheckBox) можно напрямую использовать setOnCheckChangesListener в базовом классе адаптера. Теперь вам просто нужно отслеживать запись флажка и соответствующую ему позицию в ArrayList. Теперь, когда вы нажимаете на Delete btn, затем удаляете элемент из массива. и вызвать notifyDataSetChanged ()

0 голосов
/ 26 января 2012

Если вы используете просмотр списка в режиме CHOICE_MODE_MULTIPLE, вы сможете использовать что-то вроде: listView.getCheckedItemPositions ();

тогда, если у вас есть элементы списка, хранящиеся в каком-либо списке или векторе, вы сможете легко удалять элементы с одинаковыми позициями и обновлять вид списка.

Хотя все мои знания о флажках и списках основаны на этом: Список Android и флажок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...