2012-01-26 73 views
4

我在列表中有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

+0

你可以發佈你的代碼嗎? –

+0

@一個公平的球員,請參閱我的代碼。 –

回答

10

我在我的一個應用程序中執行了相同的任務。

你應該做的是使用一個ArrayList與列表項目大小相同,每個項目默認包含0。現在在您選中的每個複選框的高效適配器中,在arrayList中的特定位置指定1。最後在按鈕上單擊刪除,遍歷ArrayList,並從列表中刪除所有那些包含1的項目,該列表中包含1,並且最後調用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 
     } 

在efficientAdapter的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

我我假設我有被選中的ID。 現在只需arrayList.remove(position);和 調用notifyDataSetChanged();

0

如果您使用模式CHOICE_MODE_MULTIPLE的列表視圖,您應該可以使用類似於: listView.getCheckedItemPositions();

然後,如果您有列表項存儲在某種列表或向量中,您應該能夠輕鬆刪除具有相同位置的項目,並更新列表視圖。

Altough我所有的複選框+列表知識是基於這樣的: Android list and checkbox

+0

他沒有問如何創建多個選擇列表視圖。 – Richa

+0

我試圖給出一個關於如何刪除這些項目的想法,以防他正在使用multiselect-listview(他可以說是)。 – varesa

2

的人,你的代碼缺少複選框和對象之間的關係,你也沒有實現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,並向適配器和休息適配器列表。可以通過填充模型,然後使用適配器調用notifyDataSetChanged()(其最初傳遞到陣列的原之一)也進行

步驟數7。

這就是所有,這就是我總是爲我工作...希望這也可以幫助你。

0

我認爲你的問題不需要任何大量的代碼。你只需要一個概念。答案以上是做到這一點的最佳方式。

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

方式列表視圖子兒(複選框)可以使用setOnCheckChangesListener在底座適配器類directly.Now你只需要繼續檢查複選框的跟蹤記錄,並在其ArrayList.Now相應的位置,當你刪除BTN然後點擊從arraylist中刪除元素並調用notifyDataSetChanged()

+0

你解決了嗎?如果你有另一個疑問如何實施它,然後告訴我們 – Sameer

0

當您選擇了複選框並按下刪除按鈕時,再次刷新列表視圖。意味着您必須在刪除項目後再次將適配器設置爲列表視圖。謝謝