自定义cursoradapter位置错误

S.M*_*ian 4 android

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

喜欢这张照片是我的listview:

(红色数字错了)

在此输入图像描述

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);
     }
}
Run Code Online (Sandbox Code Playgroud)

我之前见过这些问题:

自定义适配器中的错误位置

自定义游标适配器错位

mik*_*guy 13

A 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();

       }}); 


 }
Run Code Online (Sandbox Code Playgroud)