创建一个应用,其中我在listview
中显示Feed并在sqlitedatabase
中存储Feed记录。现在我希望如果有人添加新的Feed,那么listview
应该使用后台服务自动更新,服务将每1分钟运行一次,并且应该在数据库中插入新值并生成新添加的feed的通知。< / p>
我不知道如何添加服务以及如何在服务类中为listview设置适配器。我知道我必须为此添加意向服务。 搜索但我不明白。
我想要的:假设我在Feed列表视图中有两张图片,而有人又添加了一张图片,因此这个新添加的图片应自动显示在我的Feed中,而不会刷新Feed列表视图。为此,我必须运行后台服务,该服务将每1分钟运行一次,并且将显示新添加的图像。
但我不知道如何添加服务,为此如何在服务类中调用服务器并在服务类的listview中添加数据并在sqlitedatabase中添加记录并生成新feed的通知。这一切都将在服务类。为listview扩展baseadapter。
答案 0 :(得分:1)
就像我说的,你需要一个ListAdapter来控制你的变化和异步。
例如:
// Get ListView object from xml
listView = (ListView) findViewById(R.id.list);
// Defined Array values to show in ListView
String[] values = new String[] { "Android List View",
"Adapter implementation",
"Simple List View In Android",
"Create List View Android",
"Android Example",
"List View Source Code",
"List View Array Adapter",
"Android Example List View"
};
// Define a new Adapter
// First parameter - Context
// Second parameter - Layout for the row
// Third parameter - ID of the TextView to which the data is written
// Forth - the Array of data
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, android.R.id.text1, values);
// Assign adapter to ListView
listView.setAdapter(adapter);
您只需要添加或更改数组的服务例程 - 适配器将处理您的背景资料。
如果您使用Firebase数据库,则会有一个特殊的FirebaseListAdapter,它会检查删除,添加,更改数据并自动更新您的列表。
对于SQLite的特定问题,您应该执行以下操作:
Cursor cursor = dbHelper.fetchAllCountries();
// The desired columns to be bound
String[] columns = new String[] {
CountriesDbAdapter.KEY_CODE,
CountriesDbAdapter.KEY_NAME,
CountriesDbAdapter.KEY_CONTINENT,
CountriesDbAdapter.KEY_REGION
};
// create the adapter using the cursor pointing to the desired data
//as well as the layout information
dataAdapter = new SimpleCursorAdapter(
this, R.layout.country_info,
cursor,
columns,
to,
0);
ListView listView = (ListView) findViewById(R.id.listView1);
// Assign adapter to ListView
listView.setAdapter(dataAdapter);
答案 1 :(得分:0)
您可以使用BusEvent解决方案。当您的服务检测到更改时,您将使用chages发布新事件。包含ListView的活动将监听此事件并将更新适配器。
您可以使用Otto这样的库,或者使用RxAndroid和RxJava RxBus的新方法。
我认为最好的选择是otto,因为集成RxAndroid对于简单的通信来说太过分了。
奥托的解决方案可能是:
dependencies {
compile 'com.squareup:otto:1.3.8'
}
BusProvider.java
import com.squareup.otto.Bus;
import com.squareup.otto.ThreadEnforcer;
public final class BusProvider {
private static final Bus BUS = new Bus(ThreadEnforcer.ANY);
private BusProvider() {
// No instances.
}
public static Bus getInstance() {
return BUS;
}
}
ListDataEvent.java
public class ListDataEvent {
List<YourObject> data; ////set your data
}
YourActivity.java
public class YourActivity extends AppCompatActivity {
@Override
public void onResume() {
super.onResume();
BusProvider.getInstance().register(this);
}
@Override
public void onPause() {
super.onPause();
BusProvider.getInstance().unregister(this);
}
@Subscribe
public void onListDataEvent(ListDataEvent event) {
//fill your adapter with event.data and update the listView
}
}
最后服务:
public class YourService extends IntentService {
@Override
protected void onHandleIntent(Intent workIntent) {
//Gets data and post the event
BusProvider.getInstance().post(new ListDataEvent(data));
}
}