CursorAdapter не вызывает newView или bindView android

Я пытаюсь отобразить изображения из базы данных в GridView в Fragment. По какой-то причине метод CursorAdapter newView() или bindView() не вызывается. Вот мой код:

Класс GridImageAdapter.java:

public class GridImageAdapter extends CursorAdapter {
    private static String TAG = "Image_Debug";

    private Context mContext;
    private int count;
    private String columnname;

    public GridImageAdapter(Context context,Cursor cursor,int flag){
        super(context,cursor,flag);
        this.mContext = context;
        //this.columnname = columnname;
        Log.d(TAG, "calling grid imageadapter now");
    }

    @Override
    public int getCount() {
        return count;
    }


    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    /*@Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ImageView image;
        ViewHolder holder;

        if(convertView == null) {
            LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.media_view, null);
            holder = new ViewHolder();  
            holder.image = (ImageView)convertView.findViewById(R.id.media_image_id);    
            convertView.setTag(holder); 
        } else {
            holder = (ViewHolder)convertView.getTag();
        }   

           // holder.image.setImageBitmap((position).getBitmap());    

        return convertView;
    }*/

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        Log.d(TAG, "calling bind view");
        ViewHolder holder = (ViewHolder)view.getTag();
        String name = cursor.getString(cursor.getColumnIndexOrThrow(WeatherImageDB.CLOUDY));
        Log.d(TAG, "string name in gridimageadapter is" + name);

        BitmapFactory.Options options = new BitmapFactory.Options();
        Bitmap bitmap = BitmapFactory.decodeFile(name);

        Bitmap newbitmap = Bitmap.createScaledBitmap(bitmap, 120, 120, false);
        holder.image.setImageBitmap(newbitmap);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup container) {
        Log.d(TAG, "calling new view here");
        ViewHolder holder = new ViewHolder();

            LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View view = inflater.inflate(R.layout.media_view, container, false);

            holder.image = (ImageView)view.findViewById(R.id.media_image_id);   
            view.setTag(holder);    

            return view;
    }
}

class ViewHolder {
   ImageView image;
   TextView item_name;
}

и из фрагмента:

public class PhotoFragment extends Fragment implements LoaderCallbacks<Cursor> {

private static final int FRIENDS_LOADER = 0;

private static final int MYLOADER_LOADER = 1;

    TextView text;
    GridView grid;
    GridImageAdapter imageAdapter;

    PhotoDB dbadapter;

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

        dbadapter = new PhotosDB(getActivity().getApplicationContext()); //database class

        getActivity().getSupportLoaderManager().initLoader(FRIENDS_LOADER, null, this);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState){
        super.onActivityCreated(savedInstanceState);

        setRetainInstance(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
            Bundle savedInstanceState){

        View view = inflater.inflate(R.layout.my_tags, container, false);


    text = (TextView)view.findViewById(R.id.my_header_text_id);
    grid = (GridView)view.findViewById(R.id.my_tag_gridview_id);
    grid.setClipToPadding(false);

    imageAdapter = new GridImageAdapter(getActivity().getApplicationContext(), null, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
    grid.setAdapter(imageAdapter);
        return view;
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {

        switch(id){
        case FRIENDS_LOADER:
                return new CustomCursorLoader(getActivity().getApplicationContext(), dbadapter,PhotoDB.FRIENDS);

        case MY_LOADER:

            return new CustomCursorLoader(getActivity().getApplicationContext(),dbadapter,PhotoDB.MYFOTOS);
        }

        return null;
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        if(loader.getId() == 0){
            imageAdapter.swapCursor(data);
                    text.setText("Friend Photos");  
    }

    @Override
    public void onLoaderReset(Loader<Cursor> args) {
        imageAdapter.swapCursor(null);

    }

    public static final class CustomCursorLoader extends SimpleCursorLoader {

        String columnname;
        PhotoDB dbadapter;

        public CustomCursorLoader(Context context, PhotoDB dbadapter, String columnname){
            super(context);
            this.dbadapter = dbadapter;
            this.columnname = columnname;
        }

        public CustomCursorLoader(Context context,String columnname){
            super(context);
            this.columnname = columnname;
        }

        @Override
        public Cursor loadInBackground() {
            Cursor cursor = null;
            dbadapter.open();

            Log.d(TAG, "retrieving tag from database now");
            cursor = dbadapter.retrieveTag(columnname);

            return cursor;
        }

    }

}

Итак, мой вопрос: почему CursorAdapter не вызывает методы newView()/bindView()? Я даже не могу получить вывод logcat по этим методам, поэтому я знаю, что это не туда. Спасибо.


person irobotxx    schedule 14.07.2012    source источник
comment
Пожалуйста, помогите!! .. Я действительно борюсь здесь уже несколько дней. NewView или BindView просто не вызываются со всем, что я пробовал :(   -  person irobotxx    schedule 17.07.2012
comment
Я думаю, вы уже решили это (в этом случае вы должны добавить ответ и принять его, чтобы ответить на вопрос), но вы используете переменную count, которая по умолчанию инициализируется с помощью 0 (вы не инициализируете ее ничем другим), поэтому адаптер считает, что у него нет строк для отображения.   -  person user    schedule 14.09.2012


Ответы (3)


Ну, я знаю, что уже поздно - я не нашел этот пост, но у меня была та же проблема (хотя я просто пытался сделать список дел). Я провел последние три часа, пытаясь понять, в чем проблема, и искал возможные решения где-то в Интернете.

Может быть, это могло бы помочь кому-то еще, так что я поставлю это.

В моем случае сработало следующее:

Это часть моей основной деятельности с методом onCreate:

public class TimeTrackerActivity extends Activity implements LoaderCallbacks<Cursor>
{
public static final int TIME_ENTRY_REQUEST_CODE = 1;
public static final int TIME_EDIT_REQUEST_CODE = 2;

private TimeTrackerAdapterDB adapter;
private TimeTrackerDatabaseHelper databaseHelper;
private ListView listView;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    //Database Helper
    databaseHelper = new TimeTrackerDatabaseHelper(this);
    //ListView that wasn't showing anything -before solving it-
    listView = (ListView)findViewById(R.id.times_list);
    //A private method I made for adding a listener to the ListView
    setListViewListener(listView);

    this.getLoaderManager().initLoader(0, null, this);
}

... и переходим к методам LoaderCallbacks:

    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    CursorLoader loader = new CursorLoader(this, 
            TimeTrackerContentProvider.CONTENT_URI, null, null, null, null);

    return loader;
}

public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
            // I'm initializing my custom adapter here because it requires a cursor
    if (adapter == null)
        adapter = new TimeTrackerAdapterDB(this, cursor);
    else
        adapter.swapCursor(cursor);

    //THIS IS WHAT SOLVED IT!
    listView.setAdapter(adapter);
}

Итак, в моем случае причина, по которой он не работал, заключалась в том, что адаптер не был установлен в ListView, поэтому мой список ничего не показывал, а методы newView() и bindView() никогда раньше не вызывались.

Возможно, это могло бы сработать, установив адаптер для GridView на вашем onLoadFinished после загрузки курсора.

Не знаю, решит ли это вашу проблему или чью-то еще, но это сработало для меня. Надеюсь, поможет.

person Roberto S.    schedule 14.09.2012
comment
У меня была такая же проблема, и проблема в том, что вы вызываете setAdapter в ближайшее время в жизненном цикле. Вам нужно вызвать setAdapter в onViewCreated (или позже). Делая это таким образом, вы можете удалить весь код, кроме swapCursor, в методе onLoadFinished. - person Arno van Lieshout; 27.05.2014

Попробуйте изменить свой код в этом формате, он должен работать так, как вы хотите.

 class GridImageAdapter extends CursorAdapter {
            LayoutInflater mInflater; 
            SimpleDateFormat sdf; 

            GridImageAdapter (Context context, Cursor cursor)
            {
                super(context, cursor);
                mInflater = (LayoutInflater) context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            }

            @Override
            public View newView(Context context, Cursor cursor, ViewGroup parent)
            {
                return mInflater.inflate(R.layout.yourxml, parent, false);
            }

           @Override
            public void bindView(View row, Context context, Cursor cursor)
            {
                ImageView expensesdate = (ImageView) row.findViewById(R.id.dateWorked); 
                        You can Assign your image with this imageview.

            } 
        }

Надеюсь, поможет.

person vinothp    schedule 14.07.2012
comment
Попробовал ваш код. это все еще не работает. я не очень понимаю, почему это происходит. :( - person irobotxx; 14.07.2012

У меня тоже есть эта проблема, я решил ее таким образом, вы можете попробовать. В вашем фрагменте измените эту строку:

getActivity().getSupportLoaderManager().initLoader(FRIENDS_LOADER, null, this);

to

getLoaderManager().initLoader(FRIENDS_LOADER, null, HomeFragment.this).forceLoad();

Первый не работает, потому что делает действие контекстом, поэтому фрагмент не будет уведомлен.

person eine z    schedule 09.02.2017