android listview 监听器不起作用?

标签 android events listview listener

这是我的布局 main.xml ;

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ListView android:id="@+id/android:list" android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:layout_weight="1" android:visibility="visible" android:clickable="true"/>

</LinearLayout>

这是扩展 ListActivity 的 MainActivity;

 public class MainActivity extends ListActivity {
        private final List<SpinnerEntry> spinnerContent = new LinkedList<SpinnerEntry>();
        private ListView contactListView;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            contactListView=getListView();
queryAllRawContacts();
registerForContextMenu(getListView());

@Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Intent i = new Intent(this, ContactDetailsActivity.class);
        i.putExtra("hello", id);
        // Activity returns an result if called with startActivityForResult

        startActivity(i);
    }

private void queryAllRawContacts() {


        final String[] projection = new String[] {
                RawContacts.CONTACT_ID,                 // the contact id column
                RawContacts.DELETED                     // column if this contact is deleted
        };

        final Cursor rawContacts = managedQuery(
                RawContacts.CONTENT_URI,                // the uri for raw contact provider
                projection, 
                null,                                   // selection = null, retrieve all entries
                null,                                   // not required because selection does not contain parameters
                null);                                  // do not order

        final int contactIdColumnIndex = rawContacts.getColumnIndex(RawContacts.CONTACT_ID);
        final int deletedColumnIndex = rawContacts.getColumnIndex(RawContacts.DELETED);

        spinnerContent.clear();
        if(rawContacts.moveToFirst()) {                 // move the cursor to the first entry
            while(!rawContacts.isAfterLast()) {         // still a valid entry left?
                final int contactId = rawContacts.getInt(contactIdColumnIndex);
                final boolean deleted = (rawContacts.getInt(deletedColumnIndex) == 1);
                if(!deleted) {
                    spinnerContent.add(queryDetailsForContactSpinnerEntry(contactId));
                }
                rawContacts.moveToNext();               // move to the next entry
            }
        }

        rawContacts.close();
        final ContactsSpinnerAdapater adapter = new ContactsSpinnerAdapater(spinnerContent, this);
        contactListView.setAdapter(adapter);
    }

这是我的自定义适配器类,名为 ContactsSpinnerAdapater ;

public class ContactsSpinnerAdapater extends BaseAdapter implements
        SpinnerAdapter{
    private final List<SpinnerEntry> content;
    private final Activity activity;

    public ContactsSpinnerAdapater(List<SpinnerEntry> content,
            Activity activity) {
        super();
        this.content = content;
        this.activity = activity;
    }

    public int getCount() {
        return content.size();
    }

    public SpinnerEntry getItem(int position) {
        return content.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView,
            ViewGroup parent) {
        final LayoutInflater inflater = activity.getLayoutInflater();   // default layout inflater
        final View spinnerEntry = inflater.inflate(
                R.layout.row, null);                // initialize the layout from xml
        final TextView contactName = (TextView) spinnerEntry
                .findViewById(R.id.cName);
        final ImageView contactImage = (ImageView) spinnerEntry
                .findViewById(R.id.userIcon);
        final SpinnerEntry currentEntry = content.get(position);    
        contactName.setText(currentEntry.getContactName());
        contactImage.setImageBitmap(currentEntry.getContactPhoto());
        spinnerEntry.setOnClickListener(new OnClickListener(){


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

            }});
        return spinnerEntry;
    }




}

问题是,无论我尝试什么,当单击任何列表项时,我都无法启动 ContacDetailsActivity Intent 。基本上,监听器某种程度上未被激活。那么你能不能看看代码并告诉我我在哪里遗漏了它?

最佳答案

您将 Intent 起始代码放在了错误的位置。你需要输入这段代码:

    super.onListItemClick(l, v, position, id);
    Intent i = new Intent(this, ContactDetailsActivity.class);
    i.putExtra("hello", id);
    // Activity returns an result if called with startActivityForResult

    startActivity(i);

像这样在适配器中的 getView 方法中

public View getView(int position, View convertView,
        ViewGroup parent) {
    final int myFinalPosition = position;
    final LayoutInflater inflater = activity.getLayoutInflater();   // default layout inflater
    final View spinnerEntry = inflater.inflate(
            R.layout.row, null);                // initialize the layout from xml
    final TextView contactName = (TextView) spinnerEntry
            .findViewById(R.id.cName);
    final ImageView contactImage = (ImageView) spinnerEntry
            .findViewById(R.id.userIcon);
    final SpinnerEntry currentEntry = content.get(position);    
    contactName.setText(currentEntry.getContactName());
    contactImage.setImageBitmap(currentEntry.getContactPhoto());
    spinnerEntry.setOnClickListener(new OnClickListener(){


        public void onClick(View arg0) {
          Intent i = new Intent(activity, ContactDetailsActivity.class);
          i.putExtra("hello", getItemId(myFinalPosition));
          // Activity returns an result if called with startActivityForResult

          activity.startActivity(i);

        }});
    return spinnerEntry;
}

注意使用 Activity 变量来启动 Intent 。

关于android listview 监听器不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7862208/

相关文章:

android - 如何使 Picasso 加载图像更快?

c++ - Windows 服务不捕获关闭事件 C/C++

c# - Lambda 和内存泄漏 : Looking for alternative approaches

swift - 停止在 Swift 中监听 NSEvent

java - 安卓 : get id of listview row when button clicked

android - 如何在Android中自动淡出 ListView 项一项一项?

java - Android 变量作用域;或者,我的绳子到底在哪里

android - 如何在Android中实现图像失真效果

android - 查询 MediaStore.Images.Media ,如何同时查询 EXTERNAL_CONTENT_URI 和 INTERNAL_CONTENT_URI?

android - Android 4.0 如何在ListView 中实现类似滑动关闭的功能?