自定义cursoradapter位置错误

时间:2014-03-16 20:24:23

标签: android

当我点击call_btn按钮时,它显示错误的位置!

喜欢这张照片是我的列表视图:

(红色数字错误)

enter image description here

public class MyAdapter extends CursorAdapter
    {
        Context b;

        LayoutInflater inflater;
        @SuppressWarnings("deprecation")
        public MyAdapter(Context context, Cursor c) {
            super(context, c);
            inflater = LayoutInflater.from(context);
            b= (Context) context;
      }

    @Override
    public void bindView(View view, Context context, final Cursor cursor) {
      // TODO Auto-generated method stub
        TextView tv1 = (TextView)view.findViewById(R.id.txt_name);
        TextView tv2 = (TextView)view.findViewById(R.id.txt_numer);

        tv1.setText(cursor.getString(2));
        tv2.setText(cursor.getString(3));


        final Button call_btn= (Button)view.findViewById(R.id.call_btn);    

        call_btn.setOnClickListener(new Button.OnClickListener(){

           @Override
           public void onClick(View v) { 

               Toast.makeText(b, cursor.getString(1), Toast.LENGTH_SHORT).show();

           }}); 


     }

        protected Context getActivity() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
            public View newView(Context context, Cursor cursor, ViewGroup parent) {
            return inflater.inflate(R.layout.item, parent, false);
     }
}

我之前见过这些问题:

Wrong position in Custom Adapter

custom cursor adapter wrong position

2 个答案:

答案 0 :(得分:13)

Cursor只是数据库中的结果集,其中位置指针指向当前行。当您滚动列表并根据光标数据填写新行时,此位置指针会自动为您移动

因此,当为列表中的每一行调用bindView()时,位置设置正确,这就是TextViews具有正确文本的原因,但是当调用call_btn.onClick()时,我们不会知道光标的当前位置是什么,并且无法保证它指向与onClickListener被调用时bindView()实例化时相同的位置。

解决方案非常简单。尝试使用下面的编辑版本替换您的bindView()方法,该版本明确保存位置,然后使用该方法将光标移动到onClick()方法中的右侧行:

@Override
public void bindView(View view, Context context, final Cursor cursor) {
  // TODO Auto-generated method stub
    TextView tv1 = (TextView)view.findViewById(R.id.txt_name);
    TextView tv2 = (TextView)view.findViewById(R.id.txt_numer);

    tv1.setText(cursor.getString(2));
    tv2.setText(cursor.getString(3));


    final Button call_btn= (Button)view.findViewById(R.id.call_btn);    
    final int position = cursor.getPosition();

    call_btn.setOnClickListener(new Button.OnClickListener(){

       @Override
       public void onClick(View v) { 

           cursor.moveToPosition(position);
           Toast.makeText(b, cursor.getString(1), Toast.LENGTH_SHORT).show();

       }}); 


 }

答案 1 :(得分:0)

另一个简单的解决方案是通过setTag(cursor.getPosition())将位置保存到按钮标记;到你的call_btn:

@Override
public void bindView(View view, Context context, final Cursor cursor) {
  // TODO Auto-generated method stub
    TextView tv1 = (TextView)view.findViewById(R.id.txt_name);
    TextView tv2 = (TextView)view.findViewById(R.id.txt_numer);

    tv1.setText(cursor.getString(2));
    tv2.setText(cursor.getString(3));

    final Button call_btn= (Button)view.findViewById(R.id.call_btn);    
    call_btn.setTag(cursor.getPosition());

    call_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ((MainActivity) context).onBtnClick((int)v.getTag());
        }
    });
}

onClickListener然后将位置传递给您的活动,您只需声明:

public void onBtnClick(int position) {
    // do your stuff
}
相关问题