2015-06-03 57 views
-1

我的应用程序能够拍照并保存并显示在列表中。它们也可以被删除并且列表被正确更新。 但是,如果关闭应用程序然后再次启动它,则列表不会更正确。详细介绍:在onCreate中加载图像无法正确填充适配器

这些都是在适配器列表中的元素我拿两张照片后:

List[0] 20150603_042556 
List[1] 20150603_042601 

这些照片被正确地保存。不过,如果我关闭并重新打开该应用程序,这是发生了什么:

Loaded selfie:﹕ 20150603_042556 
List[0] 20150603_042556   
Loaded selfie: 20150603_042601 
List[0] 20150603_042601   
List[1] 20150603_042601 

这是附加功能:

public void add(SelfieRecord listItem) { 
    list.add(listItem); 
    for(int k=0;k<list.size();k++) 
     Log.i("List: ", String.valueOf(k) + " " + list.get(k).getPicName()); 
    notifyDataSetChanged(); 
} 

这是我如何加载保存的图片:

for (int ii = 0; ii < dirFiles.length; ii++) { 
    File file = dirFiles[ii]; 
    String path = file.getAbsolutePath(); 
    selfie.setPic(path); 
    selfie.setPicName(path.substring(path.indexOf("_") + 1, path.lastIndexOf("_"))); 
    Log.i(TAG+" Loaded selfie: ",path); 
    mAdapter.add(selfie); 
} 

无法弄清楚会发生什么。

编辑:更多代码如下。

在主要活动:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // setup notifications 
     setNotifications(); 

     mListView = (ListView)findViewById(R.id.selfieList); 
     mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Intent intent = new Intent(MainActivity.this, ViewActivity.class); 
       SelfieRecord record = (SelfieRecord) mAdapter.getItem(position); 
       intent.putExtra(SELFIE_KEY, record.getPic()); 
       startActivity(intent); 
      } 
     }); 

     mAdapter = new SelfieAdapter(getApplicationContext()); 
     mListView.setAdapter(mAdapter); 

     // load selfies 
     if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) && mAdapter.getCount()==0) { 
      // gets the files in the directory 
      File fileDirectory = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath()); 
      if (!fileDirectory.exists()) { 
       fileDirectory.mkdirs(); 
      } 
      // lists all the files into an array 
      File[] dirFiles = fileDirectory.listFiles(); 

      if (dirFiles.length != 0) { 
       SelfieRecord selfie = new SelfieRecord(); 
       // loops through the array of files, outputing the name to console 
       for (int ii = 0; ii < dirFiles.length; ii++) { 
        File file = dirFiles[ii]; 
        String path = file.getAbsolutePath(); 
        selfie.setPic(path); 
        selfie.setPicName(path.substring(path.indexOf("_") + 1, path.lastIndexOf("_"))); 
        Log.i(TAG+" Loaded selfie: ",path); 
        mAdapter.add(selfie); 
       } 
      } 
     } 

     registerForContextMenu(mListView); 

    } 

在适配器:

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

     View newView = convertView; 
     ViewHolder holder; 

     SelfieRecord curr = list.get(position); 
     Log.i("List: ", String.valueOf(position)+" "+list.get(position).getPicName()); 

     if (null == convertView) { 
      holder = new ViewHolder(); 
      newView = inflater.inflate(R.layout.list_record, parent, false); 
      holder.pic = (ImageView) newView.findViewById(R.id.pic); 
      holder.name = (TextView) newView.findViewById(R.id.pic_name); 
      newView.setTag(holder); 

     } else { 
      holder = (ViewHolder) newView.getTag(); 
     } 

     //setPic(holder.pic, curr.getPic()); 
     holder.name.setText(curr.getPicName()); 
     mImageView = holder.pic; 
     new BitmapLoader().execute(curr.getPic()); 

     Log.i("Loader: ", String.valueOf(position) + " " + curr.getPicName()); 

     return newView; 
    } 

    static class ViewHolder { 

     ImageView pic; 
     TextView name; 

    } 

    public void add(SelfieRecord listItem) { 
     list.add(listItem); 
     for(int k=0;k<list.size();k++) 
      Log.i("List: ", String.valueOf(k) + " " + list.get(k).getPicName()); 
     notifyDataSetChanged(); 
    } 

    public void remove(int position) { 
     list.remove(position); 
     notifyDataSetChanged(); 
    } 

位图装载机:

public class BitmapLoader extends AsyncTask<String,Integer,Bitmap> { 

     @Override 
     protected Bitmap doInBackground(String... resId) { 

      // Get the dimensions of the View 
      int targetW = Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 160, mContext.getResources().getDisplayMetrics())); 
      int targetH = Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 120, mContext.getResources().getDisplayMetrics())); 

      // Get the dimensions of the bitmap 
      BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
      bmOptions.inJustDecodeBounds = true; 
      BitmapFactory.decodeFile(resId[0], bmOptions); 
      int photoW = bmOptions.outWidth; 
      int photoH = bmOptions.outHeight; 

      // Determine how much to scale down the image 
      int scaleFactor = Math.min(photoW/targetW, photoH/targetH); 

      // Decode the image file into a Bitmap sized to fill the View 
      bmOptions.inJustDecodeBounds = false; 
      bmOptions.inSampleSize = scaleFactor; 
      bmOptions.inPurgeable = true; 

      Bitmap bitmap = BitmapFactory.decodeFile(resId[0], bmOptions); 

      return bitmap; 

     } 

     @Override 
     protected void onPostExecute(Bitmap result) { 
      mImageView.setImageBitmap(result); 
     } 

    } 

我相信问题是,当我把元素适配器从存储中回收后:

Loaded selfie:﹕ 20150603_042556 
List[0] 20150603_042556   
Loaded selfie: 20150603_042601 
List[0] 20150603_042601   
List[1] 20150603_042601 

第二次调用适配器的add方法会覆盖第一个元素。为什么?

+0

我在这里也没有看到任何问题。你可以添加更多的代码? –

+0

添加了更多代码。 – Sharaazad

+0

在帖子结尾处更好地解决了这个问题。 – Sharaazad

回答

0

解决了在创建改变for循环:

if (dirFiles.length != 0) { 
       // loops through the array of files, outputing the name to console 
       for (int ii = 0; ii < dirFiles.length; ii++) { 
        File file = dirFiles[ii]; 
        String path = file.getAbsolutePath(); 
        SelfieRecord selfie = new SelfieRecord(); 
        selfie.setPic(path); 
        selfie.setPicName(path.substring(path.indexOf("_") + 1, path.lastIndexOf("_"))); 
        Log.i(TAG+" Loaded selfie: ",path); 
        mAdapter.add(selfie); 
       } 
      } 

必须通过不同的SelfieRecord对象的add方法。

相关问题