2013-04-06 2 views
1

Здесь я получаю сохраненные пути изображения из базы данных. Так что я показываю изображения в gridview с помощью путей. Но, как показано в моем коде ниже, я загружаю cursoradapter в asynctask. Проблема здесь в том, что в первый раз все в порядке, что требуется некоторое время, пока все изображения не будут загружены.Реализация ленивой загрузки для simplecursoradapter

Но если пользователь добавляет еще один ПОС к базе данных, он снова занимает много времени, чтобы загрузить все изображения, как я держал asynctask в onResume() сделать дополнительное фото также видно. То же самое происходит, когда пользователь добавляет каждое изображение. Может ли кто-нибудь предложить мне простой способ получить последнее добавленное изображение, видимое в gridview, без необходимости загружать все фотографии снова. Или, по крайней мере, может кто-нибудь помочь мне реализовать ленивый адаптер к нынешнему курсорному адаптеру, если это невозможно?

public class ImagesScreen extends Activity { 
    public void onCreate(Bundle savedInstanceState) 
     { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.images_screen); 
        gridView = (GridView)findViewById(R.id.gridView1); 
      String[] from = new String[] { Reminders.MOM_PATHS }; 
      int[] to = new int[] {}; 
      dbCon = new SQLiteConnectClass(ImagesScreen.this); 

      imageCursorAdapter = new ImageCursorAdapter(ImagesScreen.this, R.layout.griditem, null, from, to); 
      gridView.setAdapter(imageCursorAdapter); 

     } 

      protected void onResume() { 
      super.onResume(); 
      new GetImages().execute((Object[]) null); 
     } 

     private class GetImages extends AsyncTask<Object, Object, Cursor> { 

      @Override 
      protected Cursor doInBackground(Object... params) { 
       return dbCon.getAllImages(); 
      } 

      @Override 
      protected void onPostExecute(Cursor result) { 
       imageAdapter.changeCursor(result); 
      } 

public void addpictures(View view){ 
    // code for adding picture paths to the database by transferring to another activity. 
} 


     } 

CustomAdapter класс:

public class ImageCursorAdapter extends SimpleCursorAdapter{ 

     private int layout; 
     private LayoutInflater mLayoutInflater; 
     private Context mContext; 

     public ImageAdapter(Context context, int layout, Cursor c,String[] from, int[] to) { 
      super(context, layout, c, from, to,0); 
      this.layout = layout; 
      mLayoutInflater=LayoutInflater.from(context); 
      mContext = context; 
     } 

     public View newView(Context context, Cursor cursor, ViewGroup parent) {  
      View v = mLayoutInflater.inflate(layout, parent, false); 
      return v; 
     } 

     public void bindView(final View v, final Context context, Cursor c) { 
      final int id = c.getInt(c.getColumnIndex("id")); 
      final String imagepath = c.getString(c.getColumnIndex("paths")); 


      ImageView imageview = (ImageView)v.findViewById(R.id.imageView1); 

      File imgFile = new File(imagepath); 
      if(imgFile.exists()){ 

       Bitmap imageBitmap = decodeFile(imgFile); 
       imageview.setImageBitmap(imageBitmap); 
      } 

     } 
} 
+0

Посмотрите на этот пример http://stackoverflow.com/a/3068012/964741 –

+0

почему вы не можете использовать базовый адаптер вместо адаптера курсора. – Senthil

+0

@RajaReddyPolamReddy Не могли бы вы помочь в том, как реализовать это в моем cursror adpater, а не в простом адаптере. – Apparatus

ответ

0

использование Android-Universal-Image-Loader и установить

ImageView imageview = (ImageView)v.findViewById(R.id.imageView1); 

    File imgFile = new File(imagepath); 
     if(imgFile.exists()){ 
       imageLoader.displayImage(imageUri(ur file path), imageView); 
       } 
+0

Спасибо. Скажите, пожалуйста, какие части кода необходимо использовать в этой библиотеке, чтобы использовать этот метод displayimage(). Потому что их много? – Apparatus

4

использовать этот код

public class Imagegallery extends Activity implements OnItemClickListener, 
    OnScrollListener, OnTouchListener { 
Button btn; 

SQLiteDatabase sampleDB = null; 
String SAMPLE_DB_NAME = "hic"; 

int size = 0; 
TextView headertext; 
Button cartbtn; 

ImageView footer1, footer2, footer3, footer4, footer5; 

GridView gridView; 

boolean larg = false; 
String products; 
int j = 1; 
int ii = 0; 
String imagepath[]; 
String productname[]; 
int productid[] = new int[1000]; 

String productids[] = new String[1000]; 
int integerprodids[] = new int[1000]; 
final Context context = this; 
String filename2[]; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.currentspecial); 

    File root = new File(Environment.getExternalStorageDirectory() 
      + File.separator + "aiwhic/product" + File.separator); 
    File[] fileName = root.listFiles(); 
    filename2 = new String[fileName.length]; 
    for (int j = 0; j < fileName.length; j++) { 
     Uri uri = Uri.fromFile(fileName[j]); 
     filename2[j] = fileName[j].getAbsolutePath(); 

     Log.e("file", filename2[j]); 
    } 

    gridView = (GridView) findViewById(R.id.gridView1); 

    gridView.setAdapter(new ImageAdapter(this, filename2, filename2)); 

    gridView.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, 
       int position, long id) { 

      int isf = filename2[position].lastIndexOf("/"); 
      int laf = filename2[position].lastIndexOf("."); 
      String filename = filename2[position].substring(isf + 1, laf); 
      int pos = Integer.parseInt(filename); 
      Intent go = new Intent(Imagegallery.this, ItemsPage.class); 
      Bundle bundle = new Bundle(); 

      bundle.putInt("position", pos); 
      bundle.putString("whichclass", "imagegallery"); 
      bundle.putInt("catid", 2); 
      go.putExtras(bundle); 
      startActivity(go); 

     } 
    }); 

} 

public class ImageAdapter extends BaseAdapter { 
    private Context context; 
    private final String[] mobileValues; 
    private final String[] mobileimages; 

    public ImageAdapter(Context context, String[] mobileValues, String[] mo) { 
     this.context = context; 
     this.mobileValues = mobileValues; 
     this.mobileimages = mo; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 

     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View gridView; 

     if (convertView == null) { 

      gridView = new View(context); 

      gridView = inflater.inflate(R.layout.currentspeciallist, null); 

      TextView textView = (TextView) gridView 
        .findViewById(R.id.textView1); 
      textView.setText(mobileValues[position]); 
      textView.setVisibility(View.INVISIBLE); 
      ImageView imageView = (ImageView) gridView 
        .findViewById(R.id.imageView1); 

      imageView.setTag(mobileimages[position]); 
      new Loadimage().execute(imageView); 
      // imageView.setImageBitmap(BitmapFactory 
      // .decodeFile(mobileimages[position])); 

     } else { 
      gridView = (View) convertView; 
     } 

     return gridView; 
    } 

    public int getCount() { 
     return mobileimages.length; 
    } 

    public Object getItem(int position) { 
     return null; 
    } 

    public long getItemId(int position) { 
     return 0; 
    } 

} 

class Loadimage extends AsyncTask<Object, Void, Bitmap> { 

    private ImageView imv; 
    private String path; 

    @Override 
    protected Bitmap doInBackground(Object... params) { 

     imv = (ImageView) params[0]; 

     path = imv.getTag().toString(); 

     // Bitmap thumb = BitmapFactory.decodeFile(path); 
     BitmapFactory.Options opts = new BitmapFactory.Options(); 

     opts.inSampleSize = 2; // for 1/2 the image to be loaded 
     Bitmap thumb = Bitmap.createScaledBitmap(
       BitmapFactory.decodeFile(path, opts), 120, 120, false); 

     return thumb; 

    } 

    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     if (!imv.getTag().toString().equals(path)) { 
      /* 
      * The path is not same. This means that this image view is 
      * handled by some other async task. We don't do anything and 
      * return. 
      */ 
      return; 
     } 

     if (bitmap != null && imv != null) { 
      imv.setVisibility(View.VISIBLE); 
      imv.setImageBitmap(bitmap); 
     } else { 
      imv.setVisibility(View.GONE); 
     } 
    } 

} 

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 

} 

затем создайте xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/RelativeLayout1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:padding="5dp" > 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="100dp" 
     android:layout_height="100dp" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:src="@drawable/ic_launcher" > 
    </ImageView> 
</RelativeLayout> 

Я получаю путь к файлу напрямую. u просто получить имя из sqlite и передать строку массива

+0

+1 Ваше усилие приветствуется. Но ваш код также использует asynctask так же, как и мой, который не имеет никакого значения. Он не извлекает изображения, если все изображения не загружены – Apparatus

+0

спасибо за помощь –