我正在使用 ibeacon 和 PagerSlidingTabStrip,我可以更新卡片内容
我设置了一个电源适配器类来调用notifyDataSetChanged()方法,例如:
public class SuperAwesomeCardFragment extends Fragment {
private static final String ARG_POSITION = "position";
private int position;
private ArrayAdapter<Beacon> beaconArrayAdapter;
public static SuperAwesomeCardFragment newInstance(int position) {
SuperAwesomeCardFragment f = new SuperAwesomeCardFragment();
Bundle b = new Bundle();
b.putInt(ARG_POSITION, position);
f.setArguments(b);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
position = getArguments().getInt(ARG_POSITION);
}
public void replaceWith(Collection<Beacon> newBeacons) {
beaconArrayAdapter.clear();
beaconArrayAdapter.addAll(newBeacons);
beaconArrayAdapter.notifyDataSetChanged();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
FrameLayout fl = new FrameLayout(getActivity());
fl.setLayoutParams(params);
final int margin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources()
.getDisplayMetrics());
ListView listView = new ListView(container.getContext());
listView.setAdapter(this.beaconArrayAdapter);
listView.setLayoutParams(params);
listView.setDividerHeight(25);
fl.addView(listView);
return fl;
}
}
还骑了一个显示值的活动,但是当我运行该项目时,我收到以下消息:!!!Binder 交易失败!!!例子:
public class MainActivity extends FragmentActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private static final int REQUEST_ENABLE_BT = 1234;
private static final Region ALL_ESTIMOTE_BEACONS_REGION = new Region("rid", null, null, null);
private BeaconManager beaconManager;
private ActionBar actionBar;
private PagerSlidingTabStrip tabs;
private ViewPager pager;
private MyPagerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.actionBar = getActionBar();
if (this.actionBar != null) {
this.actionBar.setDisplayHomeAsUpEnabled(true);
}
tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
pager = (ViewPager) findViewById(R.id.pager);
adapter = new MyPagerAdapter(getSupportFragmentManager());
pager.setAdapter(adapter);
final int pageMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources()
.getDisplayMetrics());
pager.setPageMargin(pageMargin);
tabs.setViewPager(pager);
// Configure verbose debug logging.
L.enableDebugLogging(true);
// Configure BeaconManager.
beaconManager = new BeaconManager(this);
beaconManager.setRangingListener(new BeaconManager.RangingListener() {
@Override
public void onBeaconsDiscovered(Region region, final List<Beacon> beacons) {
// Note that results are not delivered on UI thread.
Log.e(TAG, "onBeaconsDiscovered");
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.e(TAG, "run");
// Note that beacons reported here are already sorted by estimated
// distance between device and beacon.
if (actionBar != null) {
actionBar.setSubtitle("Found beacons: " + beacons.size());
}
if (beacons.size() > 1) {
adapter.replaceWith(beacons);
}
}
});
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onDestroy() {
beaconManager.disconnect();
super.onDestroy();
}
@Override
protected void onStart() {
super.onStart();
// Check if device supports Bluetooth Low Energy.
if (!beaconManager.hasBluetooth()) {
Toast.makeText(this, "Device does not have Bluetooth Low Energy", Toast.LENGTH_LONG).show();
return;
}
// If Bluetooth is not enabled, let user enable it.
if (!beaconManager.isBluetoothEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
} else {
connectToService();
}
}
@Override
protected void onStop() {
try {
beaconManager.stopRanging(ALL_ESTIMOTE_BEACONS_REGION);
} catch (RemoteException e) {
Log.d(TAG, "Error while stopping ranging", e);
}
super.onStop();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_ENABLE_BT) {
if (resultCode == Activity.RESULT_OK) {
connectToService();
} else {
Toast.makeText(this, "Bluetooth not enabled", Toast.LENGTH_LONG).show();
if (this.actionBar != null) {
this.actionBar.setSubtitle("Bluetooth not enabled");
}
}
}
super.onActivityResult(requestCode, resultCode, data);
}
private void connectToService() {
if (this.actionBar != null) {
this.actionBar.setSubtitle("Scanning...");
}
beaconManager.connect(new BeaconManager.ServiceReadyCallback() {
@Override
public void onServiceReady() {
try {
beaconManager.startRanging(ALL_ESTIMOTE_BEACONS_REGION);
} catch (RemoteException e) {
Toast.makeText(MainActivity.this, "Cannot start ranging, something terrible happened",
Toast.LENGTH_LONG).show();
Log.e(TAG, "Cannot start ranging", e);
}
}
});
}
public class MyPagerAdapter extends FragmentPagerAdapter {
private final String[] TITLES = {"Categories", "Home", "Top Paid", "Top Free", "Top Grossing", "Top New Paid",
"Top New Free", "Trending"};
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public CharSequence getPageTitle(int position) {
return TITLES[position];
}
@Override
public int getCount() {
return TITLES.length;
}
@Override
public Fragment getItem(int position) {
return SuperAwesomeCardFragment.newInstance(position);
}
public void replaceWith(Collection<Beacon> newBeacons) {
replaceWith(newBeacons);
}
}
}
我知道我正在破坏可用空间,但不明白如何正确更新卡的这个过程。谁能向我解释怎么做,我的错误在哪里?
天呐!