Android如何使用简单光标适配器/自定义光标适配器从数据库加载数据并与文本和图像放在一行

时间:2014-01-23 22:06:57

标签: android android-listview simplecursoradapter android-cursoradapter

我正在尝试使用带有textview和图片视图的行自定义Android中的列表。

有: 我可以直接从数据库中获取三个textview(TextViewPurpose,TextViewStart,TextViewInfo)(目的,开始,信息)

另外两个textview(TextViewCO2,TextViewCalory)我需要根据数据库中的值来计算(我想根据距离计算CO2和Calory,这也是在数据库中)

基于两个值的图像视图(ImageTripPurpose)(如果没有上传,我使用图像。如果上传,图像将基于目的)。

现有代码只为该行添加了三个textview。

Cursor allTrips = mDb.fetchAllTrips();
SimpleCursorAdapter sca = new SimpleCursorAdapter(getActivity(),
                R.layout.saved_trips_list_item, allTrips, new String[] {
                        "purp", "start", "info" }, new int[] {
                        R.id.TextViewPurpose, R.id.TextViewStart, R.id.TextInfo });
lv.setAdapter(sca);

当我只是想在每一行上放一个图像时,我使用了它,但它不起作用。

sca.setViewBinder(new SimpleCursorAdapter.ViewBinder(){
               /** Binds the Cursor column defined by the specified index to the specified view */
               public boolean setViewValue(View view, Cursor cursor, int columnIndex){
                   if(view.getId() == R.id.icon){
                       ((ImageView)view).setImageResource(R.drawable.commute);
                       return true; //true because the data was bound to the view
                   }
                   return false;
               }
            });

此外,据说由于加载数据的延迟,不鼓励使用SimpleCursor Adapter。建议使用LoaderManager和CursorLoader。我该怎么做才能解决这些问题?

1 个答案:

答案 0 :(得分:1)

以下是一个如何完成的示例。对不起有些错误,它是从ipad打字的..只是为了给你一个主意。

          class MyFragment extends ListFragment {

            private CursorAdapter mAdapter;

            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

                String[] from = new String[] { "purp", "start", "info" };
                int[] to = new int[] {R.id.TextViewPurpose, R.id.TextViewStart, R.id.TextInfo };
                mAdapter = MyCursorAdapter(getActivity(),
                        R.layout.saved_trips_list_item, allTrips, 
                        null,
                        from , 
                        to, 
                        CursorAdapter.FLAG_REGISTER_CONTENT_OBSERV);
            }

            public void onViewCreated(View view, Bundle savedInstanceState) {
                super.onViewCreated(view, savedInstanceState);
                new AsyncTask<Void, Void, Cursor>() {
                    protected Long doInBackground(Void... voids) {
                        return mDb.fetchAllTrips();
                    }

                    protected void onPostExecute(Cursor result) {
                        mAdapter.changeCursor(result);
                    }
                }.execute();

            }

            public static class MyCursorAdapter extends SimpleCursorAdapter {
                MyCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
                    super(context, layout, c, from, to, flags)
                }

                public bindView(View view, Context context, Cursor cursor) {
                    ImageView imageView = (ImageView) view.findById(R.id.imageView);
                    imageView.setImageResource(R.drawable.commute);
                }
            }

        }