Android SimpleCursorAdapter vs. LoaderManager/CursorLoader

烂漫一生 提交于 2020-01-05 07:37:30

问题


How can I go about extending SimpleCursorAdapter to allow for the following:

2 fragments, one menu one detail. Menu ListFragment is a list of tables, detail ListFragment shows the result of a query against these tables. The detail ListFragment gets passed a table name from the selection in the menu ListFragment. In onActivityCreated inside the detail ListFragment, all records are selected into a cursor. This cursor is passed into a SimpleCursorAdapter. This SimpleCursorAdapter is then set as the ListAdapter for the detail ListFragment.

What I can't figure out is how to dynamically change the SimpleCursorAdapter to display the correct number of columns based on the cursor results. I have the column names from Cursor.getColumnNames(), and I can throw these into the String[] from parameter on the SimpleCursorAdapter constructor. But how do I dynamically create the views necessary for the int to parameter? Will SimpleCursorAdapter just not work for this situation as it is looking for ids built off an xml layout file? Should I move on to using a LoaderManager with a CursorLoader? Will that be a more flexible solution?


回答1:


You should move onto using LoaderManager with a CursorLoader.

As SimpleCursorAdapter says in part:

This constructor is deprecated. This option is discouraged, as it results in Cursor queries being performed on the application's UI thread and thus can cause poor responsiveness or even Application Not Responding errors.




回答2:


Using a LoaderManager/CursorLoader won't solve your issue with populating SimpleCursorAdapter. But you should certainly use it in order to populate your list off of the UI thread and handle configuration changes of your Activities efficiently.

Here's how to map Cursor column names to TextViews for each row:

SimpleCursorAdapter adapter = new SimpleCursorAdapter(getActivity(), 
     R.layout.custom_row,
     null, 
     new String[] { "columnName_1", "columnName_2", "columnName_3" }, 
     new int[] { R.id.txtCol1, R.id.txtCol2, R.id.txtCol3 }, 0);
setListAdapter(adapter);

This will map the 3 columns in your cursor to 3 TextViews in your layout file

So your res/layout/custom_row.xml can look like this:

<LinearLayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal">
     <TextView android:id="@+id/txtCol1"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="Your column 1 text will end up here!" />

     <TextView android:id="@+id/txtCol2"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="Your column 2 text will end up here!" />

     <TextView android:id="@+id/txtCol3"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="Your column 3 text will end up here!" />
</LinearLayout>

In the real world.. you may find better results with a TableLayout.

For CursorLoader, take a look at http://developer.android.com/guide/components/loaders.html They provide an excellent example of using a CursorLoader and LoaderManager for CursorAdapters which is what you need to do.

Hope that helps!



来源:https://stackoverflow.com/questions/6371586/android-simplecursoradapter-vs-loadermanager-cursorloader

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!