#android #listview
#Android #listview
Вопрос:
Как я могу обновить элементы listview из несвязанного класса? У меня есть этот метод в MainActivity, и я получаю «нестатический метод, на который нельзя ссылаться из статического контекста». Похоже, я могу изменить listview только из MainActivity.
В принципе, мне нужно обновлять список при каждом startBluetooth () и периодических поисках.
MainActivity
public class MainActivity extends Activity {
Button butAlwaysDiscoverable, butStartBluetooth, butScanDevices, butFriends;
ListView list;
BluetoothService bluetoothService;
List<String> mArrayDevices = new ArrayList<String>();
ArrayAdapter<String> arrayAdapter;
ArrayList<Friend> friendList = new ArrayList<Friend>();
private BluetoothAdapter mBluetoothAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//========BUTTONS=======
butStartBluetooth = (Button) findViewById(R.id.butStartBluetooth);
butAlwaysDiscoverable = (Button) findViewById(R.id.butMakeDiscoverable);
butScanDevices = (Button) findViewById(R.id.butScanDevices);
butFriends = (Button) findViewById(R.id.butFriends);
//=======DB HANDLER======
final FriendDBHandler dbHandler = new FriendDBHandler(this, null);
//=========LIST==========
list = (ListView) findViewById(R.id.myListView);
//=======BLUETOOTH=======
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
bluetoothService = new BluetoothService(getWindow().getContext());
mArrayDevices.clear();
friendList.clear();
populateList();
bluetoothService.startPeriodicSearch();
butFriends.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
for (Friend friend : dbHandler.getFriends()) {
Toast.makeText(MainActivity.this, friend.deviceName, Toast.LENGTH_SHORT).show();
}
}
});
butStartBluetooth.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
bluetoothService.startBluetooth();
}
});
butAlwaysDiscoverable.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);
startActivity(discoverableIntent);
}
});
butScanDevices.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
populateList();
mBluetoothAdapter.startDiscovery();
// Create a BroadcastReceiver for ACTION_FOUND
final BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
// When discovery finds a device
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// Get the BluetoothDevice object from the Intent
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// Add the name and address to an array adapter to show in a ListView
mArrayDevices.add(device.getName() "n" device.getAddress());
updateList();
}
}
};
// Register the BroadcastReceiver
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter); // Don't forget to unregister during onDestroy
}
});
list.setClickable(true);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
Object o = list.getItemAtPosition(position);
Toast.makeText(MainActivity.this, o.toString(), Toast.LENGTH_SHORT).show();
Friend friend = new Friend();
friend.set(o.toString());
friendList.add(friend);
dbHandler.addFriend(friend);
}
});
}
private void populateList() {
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
// If there are paired devices
if (pairedDevices.size() > 0) {
// Loop through paired devices
for (BluetoothDevice device : pairedDevices) {
// Add the name and address to an array adapter to show in a ListView
mArrayDevices.add(device.getName() "n" device.getAddress());
updateList();
}
}
}
static void updateList() {
arrayAdapter = new ArrayAdapter<String>(
MainActivity.this,
android.R.layout.simple_list_item_1,
mArrayDevices);
list.setAdapter(arrayAdapter);
}
}
BluetoothService
package com.av.timetogether;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.os.Handler;
/**
* Created by andrei on 7/5/2014.
*/
public class BluetoothService {
private static BluetoothAdapter mBluetoothAdapter;
private static Handler handler;
private Context con;
public BluetoothService(Context context) {
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
handler = new Handler();
con = context;
}
public static void startBluetooth() {
MainActivity.updateList();
if (!mBluetoothAdapter.isEnabled()) {
mBluetoothAdapter.enable();
}
}
public static void startPeriodicSearch() {
handler.postDelayed(runnable, 100);
}
private static Runnable runnable = new Runnable() {
@Override
public void run() {
if(!mBluetoothAdapter.isDiscovering())
mBluetoothAdapter.startDiscovery();
handler.postDelayed(this, 5000);
}
};
}
Комментарии:
1. mArrayDEvice, если приложение обращается к нему как к глобальной переменной, тогда вы можете получить к нему доступ в любом месте
2. Всякий раз, когда я пытаюсь вызвать updateList откуда-то еще, я должен сделать его статическим, и если я сделаю его статическим, на ArrayAdapter и list нельзя будет ссылаться из статического контекста.
3. хорошо, есть какая-либо причина, по которой u hv объявляет метод как статический?
4. если я не объявлю его как статический, я не смогу использовать его из класса BluetoothService. Если я объявлю его как статический, ArrayAdapter и list выдадут ошибку, в которой говорится, что я не могу объявить метод как статический.
5. хорошо, вы можете создать класс call Util, где вы можете объявить этот метод как общедоступный и статический и попытаться использовать его оттуда