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

标签 android listview android-studio simplecursoradapter

我制作了自定义的 SimpleCursorAdapter,这样当没有电话号码时我可以单击 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 尝试回收未使用的 ListView 项目,因此您始终必须设置所有 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() 中执行,所以只添加一次。

关于android - 自定义 SimpleCursorAdapter 和 BindView(按钮随机不可见),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31654366/

相关文章:

Android - 使用 HttpURLConnection 发布 XML 数据

Android:ListView 2.2 中的 ScrollBar 错误

android - JCodec 位图到 mp4 - 结果视频失真

android - 自定义 ListView 中的 OnClick 按钮操作

android - 在 fragment 外执行 adapter.notifyDataSetChanged()

git - Android Studio - 使用 "New Project from Version Control"时 VCS 根映射无效

java - 当我将 django API 连接到 android studio 中的应用程序时,它显示错误

android-studio - 如何在构建时关闭 Android Studio 的画外音?

android - 使用 React Native 读取 NFC 标签类型 "android.nfc.tech.NfcV"和 "android.nfc.tech.NdefFormatable"

android - Glide 不显示图像到CircleImageView Kotlin