2011-08-03 9 views
1

私に代わってこれが完全なnewbである場合はお詫び申し上げます。私はアンドロイドプログラミングの新しいブランドですし、地獄のように不満です!私は見て、これで多くの例を試しましたが、すべて同じ結果を生み出しているようです。なぜ私のListView onListItemClickは、テキスト値としてListViewを返しますか?

最終行は...私は連絡先の名前のリストビューを持っています。名前をクリックすると、トーストで名前を繰り返すことができます。しかし、代わりに自分の名前を焼くの私はここで私は、「ジョン・スミス」を参照してくださいことを期待する「[email protected]」のような値

import android.app.ListActivity; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.view.View; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 
import android.widget.Toast; 

public class ContactListOne extends ListActivity { 

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

    private Cursor getContacts() 
    { 
     // Run query 
     Uri uri = ContactsContract.Contacts.CONTENT_URI; 
     String[] projection = new String[] { 
       ContactsContract.Contacts._ID, 
       ContactsContract.Contacts.DISPLAY_NAME 
     }; 
     return managedQuery(uri, projection, null, null, null); 
    } 

    private void populateContactListOne() { 
     Cursor cursor = getContacts(); 
     //Build adapter with contact info 

     String[] fields = new String[] { 

       ContactsContract.Contacts.DISPLAY_NAME 
     }; 
     int[] to = new int[]{ 

       R.id.contactname 
     }; 

     SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.contact_list_one_rows, cursor, fields, to); 

     setListAdapter(adapter); 

    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     // TODO Auto-generated method stub 
     super.onListItemClick(l, v, position, id); 

     String keyword = getListAdapter().getItem(position).toString(); 

     Toast.makeText(this, "You selected: " + keyword,Toast.LENGTH_LONG).show(); 
    } 
} 

を得続ける私の2のxmlレイアウトです:

contact_list_one:

<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:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:id="@android:id/list" 

        /> 



    </LinearLayout> 

contact_list_one_rows:

<?xml version="1.0" encoding="utf-8"?> 



        <TextView 
        xmlns:android="http://schemas.android.com/apk/res/android" 
        android:textAppearance="?android:attr/textAppearanceMedium" 
        android:id="@+id/contactname" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:padding="7dip" 
        > 
        </TextView> 

----------------------------------更新------------- -----------------------------

これはどのようにクリーンであるか、まったく異なる理由がわかりません。しかし、私はそれが古いバージョンのアンドロイドを使って時代遅れだったウェブ上のどこかの例を見つけました...しかし、それはうまくいくようです。ここでは、これは違った、私は説明が大好きだ作品なぜ誰かが私に説明できる場合、私はすべての手段によって、自分のコードを変更する方法です:)

import android.app.ListActivity; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.view.View; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 
import android.widget.TextView; 
import android.widget.Toast; 




public class ContactListOne extends ListActivity { 

    private static final int NEW_RULE_CONTACT=1; 

    private SimpleCursorAdapter adapter; 

    private RulesDbAdapter mDbHelper; 
    private ListView wtf; 




    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.contact_list_one); 
     mDbHelper = new RulesDbAdapter(this); 



     mDbHelper.open(); 

     // Obtain handles to UI objects 



     Cursor cursor = getContacts(); 
     //Build adapter with contact info 



     String[] fields = new String[] { 

       ContactsContract.Contacts.DISPLAY_NAME 
     }; 
     int[] to = new int[]{ 

       R.id.contactname 
     }; 

     adapter = new SimpleCursorAdapter(this, R.layout.contact_list_one_rows, cursor, fields, to); 

     setListAdapter(adapter); 

     mDbHelper.close(); 
    } 


    private Cursor getContacts() 
    { 
     // Run query 
     Uri uri = ContactsContract.Contacts.CONTENT_URI; 
     String[] projection = new String[] { 
       ContactsContract.Contacts._ID, 
       ContactsContract.Contacts.DISPLAY_NAME 
     }; 
     String notInList = mDbHelper.createContactNotInList(); 



     String selection = ContactsContract.Contacts.DISPLAY_NAME + " != '' AND " + ContactsContract.Contacts.LOOKUP_KEY + notInList ; 


     String[] selectionArgs = null; 
     String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 


     return managedQuery(uri, projection, selection, selectionArgs, sortOrder); 
    } 



    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     // TODO Auto-generated method stub 
     super.onListItemClick(l, v, position, id); 


     Cursor cursor = (Cursor) adapter.getItem(position); 
     String selection = cursor.getString(1); 
     Toast.makeText(this, selection,Toast.LENGTH_LONG).show(); 



    } 



} 
+0

私の答えのdidntの仕事は 'R.layout.contact_list_one_rows'私を見る場合 –

+0

2番目のxmlレイアウトの目的は何ですか? – LUKER

答えて

0

これを試してみてください -

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
super.onListItemClick(l, v, position, id); 
String selection = l.getItemAtPosition(position).toString(); 
Toast.makeText(this, selection, Toast.LENGTH_LONG).show(); 
} 
+0

残念ながら、これは機能しませんでした。私は同じテキストトーストを得る。 [email protected] –

0

これを試してみてください。

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    // TODO Auto-generated method stub 
    super.onListItemClick(l, v, position, id); 
    String keyword = ((TextView)v.findViewById(R.id.contactname)).getText(); 
    Toast.makeText(this, "You selected: " + keyword,Toast.LENGTH_LONG).show();  } 
+0

残念ながら、これは機能しませんでした。実際にはこれを行う必要がありました: 文字列キーワード=(文字列)((TextView)getListAdapter()。getItem(position))。getText(); \t Toast.makeText(これを選択しました: "+キーワード、Toast.LENGTH_LONG).show(); 私はTextViewをインポートしなければなりませんでしたし、私はそれを実行したとき強制終了メッセージがありますか? –

+0

私の編集を試してください –

+0

私は編集を試みました...まだダイスはありません。私は2つのレイアウトを投稿しました。 –

0

あなたが関心のある列だけでなく、カーソルの行全体を実際に印刷しています。また、Javaのほとんどのオブジェクト(デフォルトでは、このオブジェクトの文字列表現、つまりtoStringが返すもの)は、JVM内のオブジェクトのメモリアドレスです。

カーソルのメソッドpublic void setStringConversionColumn (int stringConversionColumn)をパラメータ1または2で使用してみてください(jdbcのようにカラムが0の場合は覚えていません)。そして、この値に文字列を取得するには、

CharSequence selection = convertToString(cursor); 

を使用することができます - UPDATE

//somewhere in onCreate 
cursor.setStringConversionColumn (0 or 1); 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    //for that you will need to define cursor as a data member 
    CharSequence selection = convertToString(cursor); 
    Toast.makeText(this, selection, Toast.LENGTH_LONG).show(); 
} 

よろしく、 ステファン

+0

申し訳ありませんが、私はJavaとAndroidのプログラミングの両方に新しいです。私はあなたが何を示唆しているか正確に従うことを確信していません。あなたはコードを書く方法をモックアップできますか? –

+0

これは機能しますか?選択肢のようなものを印刷して、何が起こるかを確認します。 – Snicolas

+0

申し訳ありません、私はかなり厚くなければなりません...しかし、私はちょうど上記のコードに従わないとき。私のカーソルは、private void populateContactListOne()にあります。私はそこにcursor.setSTringConversion(0)を入れてみました。そして、これをコードに変更しました:((SimpleCursorAdapter)cursor).setStringConversionColumn(0);しかし、私はCharSequence selection = convertToString(cursor)を適用しようとします。 Toast.makeText(this、selection、Toast.LENGTH_LONG).show(); カーソルは、アクティビティ全体で使用可能な変数ではなく、もはや参照できません。私は何を間違えているのですか? –

関連する問題