【问题标题】:android listview listener does not work?android listview 监听器不起作用?
【发布时间】:2011-10-22 19:56:18
【问题描述】:

这是我的布局 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);
    }

这是我的 customadapter 类,名为 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 意图。基本上,监听器有些怎么没有被激活。那么您能否看一下代码并告诉我我在哪里错过了它?

【问题讨论】:

    标签: android events listview listener


    【解决方案1】:

    您将意图起始代码放在错误的位置。您需要输入以下代码:

        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。

    【讨论】:

    • 感谢您的回答。问题是这个适配器类是一个不同的类。因此,如果我像您在上面所做的那样将 Intent 放在班级中,那么这在那里没有任何意义,而且 id 来自哪里?或者我应该做的是将customadapter子类化为活动类中的内部类并尝试一下?你有什么建议?
    • 哎呀。你是对的。那是复制粘贴错误。我已修改我的答案以解决您的两个问题。
    • Brilliant :) 干杯,我很感激。唯一缺少的一件事是,在启动活动时,它应该被称为 activity.startActivity(i);否则它找不到方法:) 非常感谢。我不确定我是否可以在这里问它现在可以工作但是当我点击任何项目时它不会改变项目的颜色以使其像被点击一样?我应该在 xml 中明确地对此进行编程吗?
    • @akdurmus 您应该为此创建一个新问题。这绝对是一个很好的,我相信你会得到一些快速的答案。附言感谢您发现 startActivity 的小错误并编辑我的回复。
    • 嗨,库尔蒂斯!我对此有另一个相关问题:) 我现在遇到的问题是我无法绑定适配器并在刚刚开始的活动中到达该适配器。基本上你可以看到我想要做的是获取联系方式并将它们放在一个列表中,然后使用和适配器并将值绑定到列表视图中。之后,当单击任何列表项时,我想获取联系人的所有详细信息。为此,当新活动开始时,我可以传递位置值和数字文本,但是我不能将任何适配器传递给活动。我希望这个问题有意义:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多