我制作了自定义的 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/