2012-07-20 33 views
1

美好的一天,請有人幫我找出我的代碼有什麼問題。我可能錯過了一些東西。我的CursorAdapter沒有顯示任何內容。 現在已經在這裏掙扎了一段時間了。 任何幫助將不勝感激!CursorAdapter和CursorLoader的問題android

public class ManageTagFragment extends Fragment implements LoaderCallbacks<Cursor> { 

    private static String TAG = "Image_Debugger"; 
    private static final int IMAGE_LOADER = 0; 
    TextView text; 
    GridView grid; 
    CustomGridImageAdapter imageAdapter; 
    Cursor cursor; 
    ImageDB dbadapter; 
    private Cursor c; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     dbadapter = new ImageDB(getActivity().getApplicationContext()); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
     View view = inflater.inflate(R.layout.wallpaper_images, container, false);  
     grid = (GridView)view.findViewById(R.id.gridview); 
     return view; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState){ 
     super.onActivityCreated(savedInstanceState);  
     imageAdapter = new CustomGridImageAdapter(getActivity(), null, 0); 
     grid.setAdapter(imageAdapter); 
     imageAdapter.notifyDataSetChanged(); 
     getActivity().getSupportLoaderManager().initLoader(IMAGE_LOADER, null, this); 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     return new CustomCursorLoader(getActivity().getApplicationContext(), dbadapter, ImageDB.IMAGES); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     imageAdapter.swapCursor(data); 
    } 

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

    public static final class CustomCursorLoader extends SimpleCursorLoader { 

     String columnname; 
     ImageDB dbadapter; 
     ArrayList<String> imageuri = new ArrayList<String>(); 

     public CustomCursorLoader(Context context, ImageDB 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 Images from database now"); 
      cursor = dbadapter.retrieveTag(columnname); 

      if(cursor.moveToFirst()){ 
       final int index = cursor.getColumnIndex(columnname); 

       do { 
        final String val = cursor.getString(index); // this is just 
                   // for test 
        if (val != null) { 
         Log.d(TAG, "files are" + val); 
         imageuri.add(val); 
        } 

       } while (cursor.moveToNext()); 
      } 
      return cursor; 
     } 
    } 
} 

CustomGridImageAdapter.java:

public class CustomGridImageAdapter extends CursorAdapter { 
    private static String TAG = "Image_Debugger"; 
    private LayoutInflater inflater; 
    private int count; 

    public CustomGridImageAdapter(Context context, Cursor cursor, int flags) { 
     super(context, cursor, flags); 
     inflater = LayoutInflater.from(context); 
     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 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(ImageDB.IMAGES)); 
     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(); 
     View view = inflater.inflate(R.layout.media_view, container, false); 

     holder.image = (ImageView) view.findViewById(R.id.media_image_id); 
     holder.image.setLayoutParams(new GridView.LayoutParams(100, 100)); 
     holder.image.setScaleType(ImageView.ScaleType.FIT_CENTER); 
     view.setTag(holder); 

     return view; 
    } 

    class ViewHolder { 
     ImageView image; 
     TextView item_name; 
    } 
} 
+2

不好主意,發佈你的整個代碼... – 2012-07-20 09:41:54

+0

@AndroSelva我通常不會,但我不知道爲什麼會有這樣的麻煩,所以如果它有助於達到它的底部,那麼我有沒有選擇。 – irobotxxx 2012-07-20 09:47:21

+0

@AndroSelva,我把它縮小到只是問題。希望它現在有所幫助 – irobotxxx 2012-07-20 09:53:50

回答

1

的問題可能會在這裏。它只是一個假設。對不起,如果我錯了。

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

這裏count的值是多少。我沒有發現任何地方你已經通過count的值。所以我的假設是,int的默認值在這裏返回(即count = 0),因此你沒有在你的GridView中找到任何數據。

你可以檢查並回複評論。

+0

非常感謝!! ..沒有意識到我沒有在那裏返回任何價值。我在那裏做了一個快速檢查。順便說一下,在我的代碼中傳遞onLoadFinish中count的值是安全的:imageadapter.count = data.getCount();將計數訪問修飾符減少爲public/default,或者您會提出更好的建議嗎?再次感謝。高度欣賞它! – irobotxxx 2012-07-20 10:25:17

+0

很高興幫助你。我建議你在構造函數參數中傳遞值。這是做到這一點的最佳方式。並且不要忘記標記答案被接受。 – 2012-07-20 10:28:19

相關問題