2012-04-23 20 views
2

にデータを表示するためにCursorAdapterを拡張するカスタムアダプターを使用しています。特定の電話番号を表示するには、IDを取得したいので、クリックイベントで取得しようとします。cursoradapterのbindviewオーバーライドでビューのIDを取得できません

right.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      a = v1.getId(); 
      String num=dh.getNumberFromId(a); 
     } 
    }); 

を次のように私はgetId()呼び出しからビューの正しいIDを取得し、したがって、DBから電話番号を取得するために失敗しないのですbindメソッドでクリックリスナーを設定しています。

完全なコードはここにある:

public class CallSchedulerCustomAdapter2 extends CursorAdapter 
{  
    DbHelper dh; 

public Context con; 
public LayoutInflater inflater; 
int nameindex,phoneindex,emailindex,smsindex,msubindex,mbodyindex, column_id; 
TextView text1,text2,text3; 
int a; String s1; 



@SuppressWarnings("static-access") 
public CallSchedulerCustomAdapter2(Context con, Cursor c ) 
{ 
    super(con, c); 
    // TODO Auto-generated constructor stub 
    this.con = con; 
    nameindex = c.getColumnIndex(dh.contactname); 
    phoneindex = c.getColumnIndex(dh.contactnumber); 
    emailindex = c.getColumnIndex(dh.contactmailid); 
    smsindex=c.getColumnIndex(dh.contactsms); 
    msubindex=c.getColumnIndex(dh.contactmailsub); 
    mbodyindex=c.getColumnIndex(dh.contactmailbody); 
    column_id= c.getColumnIndex("_id"); 
    this.inflater = (LayoutInflater)con.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

    public static Cursor c; 
@SuppressWarnings("static-access") 
@Override 
public void bindView(View view, Context context, Cursor cursor) 
{  

    // TODO Auto-generated method stub 
    v1=view; 
    c=cursor; 
    text1= (TextView)view.findViewById(R.id.unschedulecontactnametv); 
    text2= (TextView)view.findViewById(R.id.unschedulecontactnumbertv); 
    text3= (TextView)view.findViewById(R.id.unschedulecontactmailidtv); 
    String s = c.getString(cursor.getColumnIndex(dh.contactname)); 
     text1.setText(s); 


    text1.setText(cursor.getString(nameindex)); 
    text2.setText(cursor.getString(phoneindex)); 
    text3.setText(cursor.getString(emailindex)); 
    View right = view.findViewById(R.id.callb1); 
    dh = new DbHelper(context); 

    right.setOnClickListener(new View.OnClickListener() 
     { 
     @Override 
     public void onClick(View v) 
     { 
      // TODO Auto-generated method stub 
       a = v1.getId(); 
      String num=dh.getNumberFromId(a); 

     } 
     }); 
    } 
あなたV1が宣言されている

答えて

0

? しかし、このように考えてみてください: あなたはlistviewでyout viewをクリックします。メソッドonClick()が呼び出されますが、その特定のビューに対してbindView()が実行された時点で割り当てられた値ではなく、v1に最後に割り当てられた値があります。 解決策の1つは、idをビューのタグプロパティに入れることです。

0

view.idを使用してdata/refを保存しないでください。 view.tagを使用すると、あらゆる種類のオブジェクトを格納できます。

public void bindView(View view, Context context, Cursor cursor) 
{  

MyDataHolder data = new MyDataHolder(cursor, "whatever"); 
view.setTag(data); 

.... 
} 



right.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 

      int viewId = v.getId(); 
      MyDataHolder data = (MyDataHolder)v.getTag() 
      if (R.id.xxxx == viewId) { // not a good idea 
     } 
      if (data.whatever == xxx) { // much better !! 
     } 

    } 
    }); 
関連する問題