当我点击call_btn按钮时,它显示错误的位置!
喜欢这张照片是我的列表视图:
(红色数字错误)
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);
}
}
我之前见过这些问题:
答案 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
}