2013-11-27 49 views
0

我已經實現了一個自定義適配器類來控制我的列表視圖。我正在實現一個按鈕,一個文本框和一個複選框列表視圖中的每一行。我有幾個不屬於listview的按鈕。他們在列表視圖下面。現在,當我檢查任意數量的框並按下不屬於列表視圖的按鈕時,我希望能夠刪除選中的框(如果有的話)。換句話說,我希望能夠通過點擊不屬於列表視圖的按鈕來刪除選中的項目。使用複選框和按鈕的自定義列表視圖實現。 Android

這裏是我的主類...

public class ASvideofiles extends Activity implements OnClickListener { 

int count = 0; 
private String[] vidNames; 
private String[] vidPaths; 
private ListView myList; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.asvideofiles); 

    Button b1 = (Button) findViewById(R.id.button1); 
    b1.setOnClickListener(this); 
    Button b2 = (Button) findViewById(R.id.button2); 
    b2.setOnClickListener(this); 

    File f = new File(Environment.getExternalStorageDirectory(), 
      "ABC/XYZ/"); 
    File[] files = f.listFiles(); 
    vidNames = new String[files.length]; 
    vidPaths = new String[files.length]; 

    if(files != null) { 
     for(int i=0; i < files.length; i++) { 
      vidNames[i] = files[i].getName(); 
      vidPaths[i] = files[i].getPath(); 
      count ++; 
     } 
    } 

    ArrayList<String> list = new ArrayList<String>(); 

    for (int i = 0; i < files.length; i++) { 
     list.add(vidNames[i]); 
    } 

    myList = (ListView)findViewById(R.id.listView1); 
    myList.setAdapter(new AScustomadapter(ASvideofiles.this, list)); 
} 

@Override 
public void onClick(View v) { 
    if(v.getId() == R.id.button1) { 


    } else if(v.getId() == R.id.button2) { 


    } 

} 
} 

這裏是我的適配器類...

 public class AScustomadapter extends BaseAdapter { 

private ArrayList<String> mListItems; 
private LayoutInflater mLayoutInflater; 
int i = 0; 
private ArrayList<Integer> checkedIndices = new ArrayList<Integer>(); 

public AScustomadapter(Context context, ArrayList<String> arrayList) { 
    mListItems = arrayList; 
    //get the layout inflater 
    mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public int getCount() { 
    return mListItems.size(); 
} 

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

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

public int getTotalCheckedCount() { 
    return checkedIndices.size(); 
} 

@Override 
public View getView(final int position, View view, ViewGroup viewGroup) { 
    ViewHolder holder; 

    if (view == null) { 
     holder = new ViewHolder(); 

     view = mLayoutInflater.inflate(R.layout.list_item, null); 
     holder.itemName = (TextView) view.findViewById(R.id.list_item_text_view); 
     holder.cb1 = (CheckBox) view.findViewById(R.id.checkBox1); 

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

    final String stringItem = mListItems.get(position); 

    if (stringItem != null) { 
     if (holder.itemName != null) { 
      holder.itemName.setText(stringItem); 
     } 
    } 

    holder.cb1.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

      if (isChecked) { 
       if(checkedIndices.contains(position)){ 

       }else { 
        checkedIndices.add(position); 
       } 

      }else { 
       checkedIndices.remove((Integer)position); 
      } 
     } 
    }); 

    if(checkedIndices.contains((Integer)position)) { 
     holder.cb1.setChecked(true); 
    } else { 
     holder.cb1.setChecked(false); 
    } 

    //this method must return the view corresponding to the data at the specified position. 
    return view; 
} 

private static class ViewHolder { 

    protected TextView itemName; 
    protected CheckBox cb1; 

} 
    } 

各行基本上填充視頻,所以一切的一切,我希望能夠刪除選中的複選框,並按下刪除按鈕。需要幫助。提前致謝。

+0

你什麼意思通過刪除按鈕,複選框單擊匹配嗎?您是否希望在點擊按鈕時取消選中複選框? –

+0

不,對不起,我的意思是我想刪除複選框被選中的整行,並按下刪除按鈕。 –

+0

我已經發布了一個答案。它工作正常 –

回答

0

維護一個布爾數組,它跟蹤被選中的CheckBoxes行的位置。

然後在您的Button onClickListener中從ArrayList中移除這些項目並將此更新的ArrayList傳遞到您的適配器。

最後調用notifyDataSetChanged()

0

在這裏,我對你的解決方案。我在主要活動本身中添加了適配器類。基本上我創建了兩個字符串類型的數組列表。當您選中複選框時,相應的textview值將存儲在列表CHECKEDLIST中。在另一個列表ALLVALUES中,所有的值都被存儲。

在按鈕點擊我既名單,如果發生一場比賽,然後我從ALLVALUES刪除該值,並調用notifydatasetchanged

package com.example.test; 

import java.io.File; 
import java.util.ArrayList; 


import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.os.Environment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.View.OnClickListener; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.CompoundButton.OnCheckedChangeListener; 

public class MainActivity extends Activity implements OnClickListener { 
    private ArrayList<String> checkedIndices = new ArrayList<String>(); 
    ArrayList<String> list = new ArrayList<String>(); 
    AScustomadapter adapter; 
int count = 0; 
private String[] vidNames = {"a","b","c","d","e","f","g","h","i"}; 
private ListView myList; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Button b1 = (Button) findViewById(R.id.button1); 
    b1.setOnClickListener(this); 



    for (int i = 0; i < vidNames.length; i++) { 
     list.add(vidNames[i]); 
    } 

    myList = (ListView)findViewById(R.id.list); 
    adapter = new AScustomadapter(getApplicationContext(), list); 
    myList.setAdapter(adapter); 
} 

@Override 
public void onClick(View v) { 
    if(v.getId() == R.id.button1) { 


     for (int i = 0; i < checkedIndices.size(); i++) { 
      for(int j = 0; j <list.size();j++){ 
      if(list.get(j).contains(checkedIndices.get(i))){ 
       list.remove(j); 
      } 
      } 
     } 
     adapter.notifyDataSetChanged(); 



    } 

} 

public class AScustomadapter extends BaseAdapter { 

private ArrayList<String> mListItems; 
private LayoutInflater mLayoutInflater; 
int i = 0; 

public AScustomadapter(Context context, ArrayList<String> arrayList) { 
    mListItems = arrayList; 
    //get the layout inflater 
    mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public int getCount() { 
    return mListItems.size(); 
} 

@Override 
public Object getItem(int i) { 
    return list.get(i); 
} 

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

public int getTotalCheckedCount() { 
    return checkedIndices.size(); 
} 

@Override 
public View getView(final int position, View view, ViewGroup viewGroup) { 
    ViewHolder holder; 

    if (view == null) { 
     holder = new ViewHolder(); 

     view = mLayoutInflater.inflate(R.layout.list_item, null); 
     holder.itemName = (TextView) view.findViewById(R.id.list_item_text_view); 
     holder.cb1 = (CheckBox) view.findViewById(R.id.checkBox1); 

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

    final String stringItem = mListItems.get(position); 

    if (stringItem != null) { 
     if (holder.itemName != null) { 
      holder.itemName.setText(stringItem); 
     } 
    } 

    holder.cb1.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
       //is chkIos checked? 
     if (((CheckBox) v).isChecked()) { 
      if(!checkedIndices.contains(getItem(index).toString())) 
       checkedIndices.add(getItem(index).toString());   } 
     else { 
      checkedIndices.remove(getItem(index).toString()); 

     } 
      //case 2 

     } 
    }); 

    if(checkedIndices.contains((Integer)position)) { 
     holder.cb1.setChecked(true); 
    } else { 
     holder.cb1.setChecked(false); 
    } 

    //this method must return the view corresponding to the data at the specified position. 
    return view; 
} 

private class ViewHolder { 

    protected TextView itemName; 
    protected CheckBox cb1; 

} 
    } 


} 
+0

如果適配器類和主類位於不同的java文件中,如問題中發佈的那個文件,它可以工作嗎? –

+0

是的。他們會@MohammadSohaib –

+0

我終於有時間嘗試它,但它不工作。問題是在AScustomadapter類中有一些像「checkedIndices」這樣的變量無法訪問。 –

相關問題