2013-04-10 85 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