自定义 SimpleCursorAdapter 和 BindView(按钮随机不可见)

custom SimpleCursorAdapter and BindView (buttons are randomly Invisible)

我制作了自定义的 SimpleCursorAdapter,这样当没有 phone 号码时我可以点击 ListView 中的按钮(按钮需要呼叫某人)我希望按钮不可见,起初我的代码正确显示了所有内容但是当我上下滚动几次按钮时,按钮随机变得不可见。

已编辑:当所有这些都可见时它很好,但是当一个(ListView 上项目内的按钮)变得不可见时,它们开始随机变得不可见。

我的代码:

 public MyCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, double lat, double lon) {
    super(context, layout, c, from, to);
    latC = lat;
    lonC = lon;
}

public MyCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
    super(context, layout, c, from, to);
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.list_view_place_list, parent, false);
        return view;
}

@Override
public void bindView(final View view,final Context context,final Cursor cursor) {
    SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);

    String name = cursor.getString(cursor.getColumnIndex(PlacesDB.PLACE_NAME));
    String address = cursor.getString(cursor.getColumnIndex(PlacesDB.PLACE_ADDRESS));
    double lat = cursor.getDouble(cursor.getColumnIndex(PlacesDB.PLACE_LAT));
    double lon = cursor.getDouble(cursor.getColumnIndex(PlacesDB.PLACE_LON));
    final String phone = cursor.getString(cursor.getColumnIndex(PlacesDB.PLACE_PHONE));

    TextView txtName = (TextView) view.findViewById(R.id.txtName);
    TextView txtAddress = (TextView) view.findViewById(R.id.txtAddress);
    TextView txtDistance = (TextView) view.findViewById(R.id.txtDistance);

    txtName.setText(name);
    txtAddress.setText(address);

    Button btnCall = (Button) view.findViewById(R.id.btnCall);
    if (latC != -1) {
        double dis = getDistanceFromLatLonInKm(latC, lonC, lat, lon);
        if (settings.getString("mk", "km").equals("miles")) {
            dis = dis / 1.621371;
            txtDistance.setText(String.format("%.3f", dis) + " Miles");
        }
        else
            txtDistance.setText(String.format("%.3f", dis) + " Km");
    } else {
        txtDistance.setText("Distance not available");
    }
    if (phone == null){
        btnCall.setVisibility(View.INVISIBLE);
    }
    else {
        view.findViewById(R.id.btnCall).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String tel;
                Intent dialIntent = new Intent();
                tel = phone.replace("-", "");
                dialIntent.setAction(Intent.ACTION_CALL);
                dialIntent.setData(Uri.parse("tel:" + tel));
                context.startActivity(dialIntent);
            }
        });
    }
}

由于 android 尝试回收未使用的列表视图项目,因此您始终必须设置所有 gui 元素

if (phone == null){
    btnCall.setVisibility(View.INVISIBLE);
}

只使 btnCall 不可见,但没有代码使回收的不可见 listview-item-btnCall 再次可见。

if (phone == null){
    btnCall.setVisibility(View.INVISIBLE);
} else {
    btnCall.setVisibility(View.VISIBLE);
}

应该完成这项工作。

出于同样的原因,view.findViewById(R.id.btnCall).setOnClickListener(...) 的代码 应该在 newView() 中执行,所以只添加一次。