2013-04-10 81 views
2

我有一個奇怪的問題,涉及獲取所選文件的位置。 它只能起到第6個文件。如果我選擇第7個文件,那麼它將不會返回任何內容。如果我只點擊第7個文件。它會將我作爲第一個文件返回。獲取選中複選框的位置

編輯:我認爲這個問題是由於當我滾動時視圖被改變,複選框被重置。

這裏是我的代碼部分。

private boolean[] selection; 
private int count; 
private List<Media> getMediaList = new ArrayList<Media>(); 
private ArrayList<String> storeSelectedMedia = new ArrayList<String>(); 

String[] projection = { 
      MediaStore.Video.Media._ID, 
      MediaStore.Video.Media.ARTIST, 
      MediaStore.Video.Media.TITLE, 
      MediaStore.Video.Media.DATA, 
      MediaStore.Video.Media.DISPLAY_NAME, 
      MediaStore.Video.Media.DURATION, 
      MediaStore.Video.Media.SIZE 
    }; 

    cursor = getContentResolver().query(
      MediaStore.Video.Media.EXTERNAL_CONTENT_URI, 
      projection, 
      null, 
      null, 
      null); 

    while(cursor.moveToNext()){ 
     getMediaList.add(new Media (cursor.getString(2), cursor.getString(6), cursor.getString(3), cursor.getString(5))); 
     //Log.i("media", "" + cursor.getString(5)); 
    } 

    cursor.close(); 
    count = getMediaList.size(); 
    Log.i("MediaSize", "" + count); 
    selection = new boolean[count]; 

    ArrayAdapter<Media> adapter = new MyMediaAdapter(this, getMediaList); 
    setListAdapter(adapter); 

public class MyMediaAdapter extends ArrayAdapter<Media> { 

    private final List<Media> list; 
    private final Activity context; 

    public MyMediaAdapter(Activity context, List<Media> list) { 
     super(context, R.layout.media_view, list); 
     this.context = context; 
     this.list = list; 
    } 

    private class ViewHolder { 
     protected TextView fName, fSub, fDuration, fSize; 
     protected CheckBox checkbox; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = null; 
     if (convertView == null) { 
      LayoutInflater inflator = context.getLayoutInflater(); 
      view = inflator.inflate(R.layout.media_view, null); 
      final ViewHolder viewHolder = new ViewHolder(); 
      viewHolder.fName = (TextView) view.findViewById(R.id.tvfname); 
      viewHolder.fSub = (TextView) view.findViewById(R.id.tvsub); 
      viewHolder.fDuration = (TextView) view.findViewById(R.id.tvduration); 
      viewHolder.fSize = (TextView) view.findViewById(R.id.tvsize); 
      viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check); 
      viewHolder.checkbox.setId(position); 
      viewHolder.checkbox.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        CheckBox cb = (CheckBox) v; 
        int id = cb.getId(); 
        if (selection[id]) { 
         cb.setChecked(false); 
         selection[id] = false; 
        } else { 
         cb.setChecked(true); 
         selection[id] = true; 
        } 
       } 
      }); 
      view.setTag(viewHolder); 
      viewHolder.checkbox.setTag(list.get(position)); 
     } else { 
      view = convertView; 
      ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); 
     } 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.fName.setText(list.get(position).getName()); 
     holder.fSub.setText(list.get(position).getPath()); 
     // Converting duration from String to Long 
     long milli = Long.valueOf(list.get(position).getDuration()); 
     // Put it in % min, % sec format to display 
     holder.fDuration.setText(String.format("%d:%d sec", 
       TimeUnit.MILLISECONDS.toMinutes(milli), 
       TimeUnit.MILLISECONDS.toSeconds(milli) - 
       TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milli)) 
      )); 

     // Convert data size from String to Long 
     long datasize = Long.valueOf(list.get(position).getData()); 
     // Put in human readable format 
     holder.fSize.setText(readableFileSize(datasize)); 
     holder.checkbox.setChecked(list.get(position).isSelected()); 
     return view; 
    } 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    final ArrayList<Integer> posSel = new ArrayList<Integer>(); 

    posSel.clear(); 
    storeSelectedMedia.clear(); 

    /* 
    * Construct the list of selected items 
    */ 
    boolean noSelect = false; 
    Log.i("MediaSelection", "" + selection.length); 
    for (int i = 0; i < selection.length; i++) { 
     if (selection[i] == true) { 
      noSelect = true; 
      Log.e("Mediasel pos thu-->", "" + i); 
      posSel.add(i); 
      storeSelectedMedia.add(getMediaList.get(i).getPath()); 
     } 
    } 

    switch (item.getItemId()) { 

    case R.id.action_refresh: 
     try { 
      rescanSdcard(); 
     } catch (Exception e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     Toast.makeText(this, "Action refresh selected", Toast.LENGTH_SHORT) 
     .show(); 
     finish(); 
     startActivity(getIntent()); 
     break; 

    case R.id.action_findfile: 
     if (noSelect) { 
     if (storeSelectedMedia.size() > 0) { 

      for (String file : storeSelectedMedia) { 
       try { 
        // Doing something 
        Log.i("Media", file.toString()); 
       } catch (Exception e) { 
        Toast.makeText(this, 
          "Exception: '" + e.getMessage(), 
          Toast.LENGTH_LONG).show(); 
       } 
      } 
     } 

我與Log.i( 「媒體」) 日誌我選擇了7個文件。但它只在日誌中顯示6。

04-11 00:31:26.879: I/MediaSelection(23155): 22 
04-11 00:31:26.879: E/Mediasel pos thu-->(23155): 0 
04-11 00:31:26.879: E/Mediasel pos thu-->(23155): 1 
04-11 00:31:26.879: E/Mediasel pos thu-->(23155): 2 
04-11 00:31:26.879: E/Mediasel pos thu-->(23155): 3 
04-11 00:31:26.879: E/Mediasel pos thu-->(23155): 4 
04-11 00:31:26.879: E/Mediasel pos thu-->(23155): 5 
04-11 00:31:26.889: I/Media(23155): /storage/sdcard0/DCIM/100MEDIA/VIDEO0001.3gp 
04-11 00:31:26.889: I/Media(23155): /storage/sdcard0/DCIM/100MEDIA/VIDEO0002.3gp 
04-11 00:31:26.889: I/Media(23155): /storage/sdcard0/DCIM/100MEDIA/VIDEO0004.mp4 
04-11 00:31:26.889: I/Media(23155): /storage/sdcard0/DCIM/100MEDIA/VIDEO0001.mp4 
04-11 00:31:26.889: I/Media(23155): /storage/sdcard0/DCIM/100MEDIA/VIDEO0002.mp4 
04-11 00:31:26.889: I/Media(23155): /storage/sdcard0/DCIM/100MEDIA/VIDEO0003.mp4 
04-11 00:31:27.059: I/MediaSize(23155): 22 
04-11 00:31:52.243: I/MediaSelection(23155): 22 
04-11 00:31:52.243: E/Mediasel pos thu-->(23155): 0 
04-11 00:31:52.243: I/Media(23155): /storage/sdcard0/DCIM/100MEDIA/VIDEO0001.3gp 
04-11 00:31:52.353: I/MediaSize(23155): 22 

不知道哪裏出了問題。

回答

1

如果您使用的是ViewHolder模式,則需要了解您的列表中每個項目沒有ViewHolder。 Android爲您回收的每個View只有ViewHolder。如果你可以在顯示器上安裝6個物品,那麼你可能會有8或9個東西。這意味着調用getView()時,需要更新ViewHolder中與所顯示項目相關的所有內容。在你的情況,這意味着你需要移動此代碼:

viewHolder.checkbox.setId(position); 
    viewHolder.checkbox.setTag(list.get(position)); 

if塊,做它所有情況下(你是否剛剛創建了一個ViewHolder或者如果你只是一個循環)。我會做這樣的:

} else { 
     view = convertView; 
     viewHolder = (ViewHolder) view.getTag(); 
    } 
    viewHolder.checkbox.setTag(list.get(position)); 
    viewHolder.checkbox.setId(position); 

此外,你應該聲明你ViewHolder類爲static,因爲它並不需要周圍的類的引用。

+0

我按照你的方法,它似乎工作。我會做更多的測試,以確保它完美運作。我已經將viewHolder移動到if(convertView == null)之前,並且我無法放置靜態,因爲它會聲明爲非法。現在,我已經取消了最後的決定。這樣好嗎? – user1778855 2013-04-10 17:48:51

+0

不,我的意思是你應該把**類定義爲靜態的:'private static class ViewHolder',而不是變量。否則,是的,將變量'viewHolder'的聲明移動到'if'塊之前並移除'final',因爲您將創建一個新的(在'if'內)或者使用'view.getTag )在'else'子句中。 – 2013-04-10 17:59:30

+0

注意。非常感謝您的幫助! – user1778855 2013-04-10 18:09:52