首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在光标适配器的绑定视图重写中获取视图的id

无法在光标适配器的绑定视图重写中获取视图的id
EN

Stack Overflow用户
提问于 2012-04-23 14:36:22
回答 2查看 768关注 0票数 2

我正在使用自定义适配器,它扩展了用于在listview中显示数据的CursorAdapter。为了显示特定的电话号码,我想要一个id,所以我尝试在单击事件中获取它。我在bind方法中设置了单击侦听器,如下所示

代码语言:javascript
复制
right.setOnClickListener(new View.OnClickListener() 
   {
        @Override
        public void onClick(View v) 
        {
            a = v1.getId();
            String num=dh.getNumberFromId(a);
        }
   });

我没有从getId()调用中获得正确的视图id,因此无法从db中获得电话号码。

完整的代码在这里:

代码语言:javascript
复制
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);

        }
       });
  }
EN

回答 2

Stack Overflow用户

发布于 2012-06-18 23:43:41

您的v1是在哪里声明的?但是这样想:你在listview中点击你的视图。方法onClick()被调用,但v1有一个上次分配给它的值,而不是为该特定视图执行bindView()时分配给它的值。一种解决方案是将id放在视图的tag属性中。

票数 0
EN

Stack Overflow用户

发布于 2014-05-06 15:42:11

不要使用view.id来存储数据/引用。使用view.tag,你可以存储任何类型的对象。

代码语言:javascript
复制
 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 !!
         }

    }
   });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10275864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档