2013-12-13 57 views
0

我想在列表視圖上獲取聯繫人並獲取按鈕單擊上的選定項目。我使用自定義適配器,但我不知道如何獲取選定的項目。如何獲得在列表視圖中的選中項與按鈕上的複選框點擊

我嘗試了很多不同的方法,像setOnItemChangeListener來存儲更改狀態項目。但沒有任何工作。

下面是代碼,

package com.example.callblocker; 

import java.util.ArrayList; 

import android.app.ListActivity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.AdapterView.OnItemSelectedListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.Checkable; 
import android.widget.CompoundButton; 
import android.widget.CompoundButton.OnCheckedChangeListener; 
import android.widget.ListView; 
import android.widget.Toast; 

/** 
* Developed by Azharahmed 
*/ 
public class MainActivity extends ListActivity { 
    /** Called when the activity is first created. */ 

    private ArrayList<Contact> contact_list = null; 
    private ProgressDialog mProgressDialog = null; 
    private contactAdapter mContactAdapter = null; 
    private Runnable mViewcontacts = null; 

    private ArrayList<Contact> items; 
    boolean[] isChecked; 
    Cursor mCursor; 
    ListView lv; 
    Button blockSelectedBtn; 

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

     contact_list = new ArrayList<Contact>(); 
     lv = getListView(); 

     blockSelectedBtn = (Button)findViewById(R.id.button1); 
     blockSelectedBtn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       for (int i = 0; i < mContactAdapter.getCount(); i++) 
       { 
        Contact contact = mContactAdapter.getItem(i); 
        if (((Checkable) contact).isChecked()) 
        { 
         Toast.makeText(MainActivity.this, 
           contact.getContactName() + " is Checked!!", 
           Toast.LENGTH_SHORT).show(); 
        } 
       } 
      } 
     }); 

     mViewcontacts = new Runnable() { 
      @Override 
      public void run() { 
       getContacts(); 
      } 
     }; 

     Thread thread = new Thread(null, mViewcontacts, "ContactReadBackground"); 
     thread.start(); 
     mProgressDialog = ProgressDialog.show(MainActivity.this, 
       "Please Wait...", "Retriving Contacts...", true); 
    } 

    @SuppressWarnings("unused") 
    private void getContacts() { 

     try { 

      String[] projection = new String[] { 
        ContactsContract.Contacts.DISPLAY_NAME, 
        ContactsContract.Contacts.HAS_PHONE_NUMBER, 
        ContactsContract.Contacts._ID }; 

      mCursor = managedQuery(ContactsContract.Contacts.CONTENT_URI, 
        projection, ContactsContract.Contacts.HAS_PHONE_NUMBER 
          + "=?", new String[] { "1" }, 
        ContactsContract.Contacts.DISPLAY_NAME); 

      while (mCursor.moveToNext()) { 
       Contact contact = new Contact(); 

       String contactId = mCursor.getString(mCursor 
         .getColumnIndex(ContactsContract.Contacts._ID)); 
       contact.setContactName(mCursor.getString(mCursor 
         .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))); 
       contact_list.add(contact); 
      } 
      isChecked = new boolean[mCursor.getCount()]; 

      for (int i = 0; i < isChecked.length; i++) { 
       isChecked[i] = false; 
      } 

      this.mContactAdapter = new contactAdapter(this, R.layout.listview, 
        contact_list); 
      lv.setAdapter(this.mContactAdapter); 
      mCursor.close(); 

      runOnUiThread(returnRes); 

     } catch (Exception e) { 
      Log.d("getContacts", e.getMessage()); 
     } 
    } 

    public class contactAdapter extends ArrayAdapter<Contact> { 

     public contactAdapter(Context context, int textViewResourceId, 
       ArrayList<Contact> items1) { 
      super(context, textViewResourceId, items1); 
      items = items1; 
     } 

     @Override 
     public View getView(final int position, View convertView, 
       ViewGroup parent) { 
      ViewHolder mViewHolder; 

      mViewHolder = new ViewHolder(); 
      LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = vi.inflate(R.layout.listview, parent, false); 
      mViewHolder.cb = (CheckBox) convertView.findViewById(R.id.checkBox); 
      mViewHolder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        Toast.makeText(MainActivity.this, "item changed", Toast.LENGTH_LONG).show(); 

       } 
      }); 
      convertView.setTag(mViewHolder); 

      if (isChecked[position] == true) 
       mViewHolder.cb.setChecked(true); 
      else 
       mViewHolder.cb.setChecked(false); 
      mViewHolder.cb 
        .setOnCheckedChangeListener(new OnCheckedChangeListener() { 

         @Override 
         public void onCheckedChanged(CompoundButton buttonView, 
           boolean ischecked) { 
          if (buttonView.isChecked()) { 
           isChecked[position] = true; 
          } else { 
           isChecked[position] = false; 
          } 
         } 
        }); 

      Contact contacts = items.get(position); 
      if (contacts != null) { 
       if (mViewHolder.cb != null) { 
        mViewHolder.cb.setText(contacts.getContactName()); 
       } 
      } 

      return convertView; 
     } 
    } 

    public class ViewHolder { 
     CheckBox cb; 
    } 

    private Runnable returnRes = new Runnable() { 

     @Override 
     public void run() { 
      if (mProgressDialog.isShowing()) 
       mProgressDialog.dismiss(); 
      mContactAdapter.notifyDataSetChanged(); 
     } 
    }; 

    } 

以下是錯誤代碼中的一個。

12-13 16:36:02.407: E/AndroidRuntime(14885): FATAL EXCEPTION: main 
12-13 16:36:02.407: E/AndroidRuntime(14885): java.lang.ClassCastException: com.example.callblocker.Contact 
12-13 16:36:02.407: E/AndroidRuntime(14885): at com.example.callblocker.MainActivity$2.onClick(MainActivity.java:62) 
12-13 16:36:02.407: E/AndroidRuntime(14885): at android.view.View.performClick(View.java:2552) 
12-13 16:36:02.407: E/AndroidRuntime(14885): at android.view.View$PerformClick.run(View.java:9229) 
12-13 16:36:02.407: E/AndroidRuntime(14885): at android.os.Handler.handleCallback(Handler.java:587) 
12-13 16:36:02.407: E/AndroidRuntime(14885): at android.os.Handler.dispatchMessage(Handler.java:92) 
12-13 16:36:02.407: E/AndroidRuntime(14885): at android.os.Looper.loop(Looper.java:130) 
12-13 16:36:02.407: E/AndroidRuntime(14885): at android.app.ActivityThread.main(ActivityThread.java:3701) 
12-13 16:36:02.407: E/AndroidRuntime(14885): at java.lang.reflect.Method.invokeNative(Native Method) 
12-13 16:36:02.407: E/AndroidRuntime(14885): at java.lang.reflect.Method.invoke(Method.java:507) 
12-13 16:36:02.407: E/AndroidRuntime(14885): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
12-13 16:36:02.407: E/AndroidRuntime(14885): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624) 
12-13 16:36:02.407: E/AndroidRuntime(14885): at dalvik.system.NativeStart.main(Native Method) 

任何提示或建議將是非常有用的。

+0

檢查這是否有幫助http://stackoverflow.com/questions/18162931/android-get-selected-item-using -checkbox-in-listview-when-i-click-a-button – Raghunandan

+0

謝謝,但我面臨的問題是我的應用程序無法獲取選定的項目。問題就出在blockSelectedBtn.setOnClickListener(新OnClickListener(){ \t \t \t \t \t \t @覆蓋 \t \t \t公共無效的onClick(視圖v){ \t \t \t \t // TODO自動生成方法存根 \t \t \t \t for(int i = 0; i Isuru

+0

第62行MainActivity.java是什麼,並檢查它是否有助於http:// stackoverflow。com/questions/17256932/displays-contact-number-and-contact-name-in-a-custom-list-view/17258014#17258014 – Raghunandan

回答

1

我不知道多少droid編程,但通常記錄這個信息從用戶你想設置一個動作監聽器,然後爲每個動作日誌和保存數據。 要編寫一個動作偵聽器,請按照下面的步驟:

聲明的事件處理程序類,並指定類要麼實現了ActionListener接口或擴展實現一個ActionListener接口的類。例如: 公共類MyClass實現了ActionListener在一個或多個組件上註冊事件處理程序類的實例作爲偵聽器。例如: someComponent.addActionListener(instanceOfMyClass); 包含在偵聽器接口中實現方法的代碼。例如: 公共無效的actionPerformed(ActionEvent的五){ ... //代碼,反應動作...... }

這裏是一個如何做但─ tutorial

相關問題