使用后台服务在listview中添加数据

时间:2017-02-27 20:25:59

标签: android listview

创建一个应用,其中我在listview中显示Feed并在sqlitedatabase中存储Feed记录。现在我希望如果有人添加新的Feed,那么listview应该使用后台服务自动更新,服务将每1分钟运行一次,并且应该在数据库中插入新值并生成新添加的feed的通知。< / p>

我不知道如何添加服务以及如何在服务类中为listview设置适配器。我知道我必须为此添加意向服务。 搜索但我不明白。

我想要的:假设我在Feed列表视图中有两张图片,而有人又添加了一张图片,因此这个新添加的图片应自动显示在我的Feed中,而不会刷新Feed列表视图。为此,我必须运行后台服务,该服务将每1分钟运行一次,并且将显示新添加的图像。

但我不知道如何添加服务,为此如何在服务类中调用服务器并在服务类的listview中添加数据并在sqlitedatabase中添加记录并生成新feed的通知。这一切都将在服务类。为listview扩展baseadapter。

2 个答案:

答案 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));
    }
}