2012-06-29 23 views
0

我寫一個Android應用程序,和我有麻煩在ListView一排的位置CheckBox獲取行位置與複選框的ListView在Android的

這裏是在模擬器截圖: https://dl.dropbox.com/u/24223262/help.png

我已經與的CheckBox作出ListView。但我無法弄清楚如何找到每個檢查條目的行位置。一旦我得到的檢查位置,我想實現一個刪除選定行動。

請幫忙!

這裏是我的代碼:

public class ListTest extends ListActivity implements OnCheckedChangeListener { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

     //--- Importing StringsArray---  
     Bundle gotBasketScanner = getIntent().getExtras(); 
     String[] StringArrayHistory = gotBasketScanner.getStringArray("fromHistory"); 

     // ---Make Adapter--- 
     setListAdapter(new ArrayAdapter<String>(ListTest.this, 
        android.R.layout.simple_list_item_multiple_choice, 
        StringArrayHistory)); 

     // ---Put Array into a ListView and add Checkboxes to Listview 
     ListView list = getListView(); 
     list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    } 
} 
+0

笑納的答案,如果你有你的解決方案:) –

回答

1

使用onItemClick()中,而不是onCheckedChangeListener ...

getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { 

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, 
          long id) { 
     Toast.makeText(getApplicationContext(), "Item "+position+" is clicked", 
           Toast.LENGTH_SHORT).show(); 
    } 
} 

這是獲得點擊位置和ID的更好方法。

我希望這能解決您的問題。

編輯

我已經更新了以下行: -

getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {

現在就來試試我們的代碼。

+0

謝謝!我對這個方向感覺很好。我在「新的OnItemClickListener」上收到錯誤消息。它說「不能實例化類型AdapterView.OnItemClickListener」...解決任何想法?我將繼續嘗試 – user1465656

+0

@ user1465656查看編輯答案。 – himanshu

+0

謝謝!我以另一種方式解決了我的問題 - 儘管我花了很長時間。再次感謝! – user1465656

0

您可以使用CheckedTextView實現相同:

main.xml中

<?xml version="1.0" encoding="utf-8"?> 
    <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:clickable="true" 
    android:focusable="true" 
    android:checkMark="?android:attr/listChoiceIndicatorMultiple"> 
    </CheckedTextView> 

addlist.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <ListView 
    android:id="@+id/mainListView" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    > 
    </ListView> 

    <Button android:id="@+id/click" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Click"/> 
</LinearLayout> 

這裏是活動GetCheckedTextPositionActivity。點擊按鈕,你會得到列表項的位置檢查:

public class GetCheckedTextPositionActivity extends Activity { 

private ListView myList; 
private EfficientAdapter myAdapter; 
private ArrayList<String> data; 
private LayoutInflater mInflater; 
private Button click; 
private ArrayList<Integer> positions; 

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

    positions = new ArrayList<Integer>(); 

    data = new ArrayList<String>(); 
    data.add("Bangalore"); 
    data.add("Delhi"); 
    data.add("Patna"); 
    data.add("Mumbai"); 

    click = (Button)findViewById(R.id.click); 
    mInflater = LayoutInflater.from(getApplicationContext()); 
    myList = (ListView) findViewById(R.id.mainListView); 
    myAdapter = new EfficientAdapter(data, getApplicationContext()); 
    myList.setAdapter(myAdapter); 

    click.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      if(positions.size() != 0){ 
       for(Integer pos : positions){ 
       Log.e("Positions checked :"," Positions :"+pos); 
       } 
      } 

     } 
    }); 

} 

public class EfficientAdapter extends BaseAdapter { 
    private ArrayList<String> myData; 

    public EfficientAdapter(ArrayList<String> mData, Context ctx) { 
     // TODO Auto-generated constructor stub 
     this.myData = mData; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return myData.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return myData.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

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

     final int currentPos = position; 

     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.main, null); 
     } 

     ((CheckedTextView) convertView).setText(myData.get(position)); 
     ((CheckedTextView) convertView).setOnClickListener(new View.OnClickListener() { 
        public void onClick(View v) { 
         ((CheckedTextView) v).toggle(); 
         if(((CheckedTextView) v).isChecked()){ 
          positions.add(currentPos); 
         } 
        } 
       }); 
     return convertView; 
    } 

} 
} 

希望這會有所幫助。

+0

謝謝!在問我的問題之前我看到了這種方法。我沒有使用這個的原因是1)我的數組是導入的,所以我不能做「data.add」個人參考,2)我不明白這個方法.. – user1465656

+1

你明白了什麼方法? ArrayList是什麼意思導入?即使你得到一個ArrayList,直接使用它,而不是創建一個ArrayList,並添加Item到它。 – AndroGeek

+0

謝謝你的幫助!我在昨天和今天的幾個小時後自己想出了代碼!我不明白這個方法,因爲有1)使用整數來引用位置的for-loop(我的情況不適合這個設置); 2)我不瞭解BaseAdapter。 但無論如何,我現在解決了我的問題! – user1465656

相關問題