2016-05-29 34 views
0

我在listview中得到重复的值,但我确信在我使用的列表中没有重复项。在listview中重复 - Android

这里是下面的代码,

public class MainActivity extends Activity { 

    ArrayList<String> listOfSongs = new ArrayList<String>(); 
    ListView liststructure; 
    final private int REQUEST_CODE_ASK_PERMISSIONS = 123; 
    String MUSIC_STRING = MediaStore.Audio.Media.IS_MUSIC + "!=0"; 
    String[] STAR = {"*"}; 
    Uri uri=null; 
    String orderColumns = MediaStore.Audio.AudioColumns.TITLE + " COLLATE LOCALISED ASC"; 
    private final int REQUEST_GRANTED_BY_USER = 1; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     liststructure = (ListView) findViewById(R.id.listView); 
     SongsList list = new SongsList(MainActivity.this, listOfSongs); 
     liststructure.setAdapter(list); 

     checkPermissions(); 
     Toast.makeText(getApplicationContext(), "Total number of Items are:" + liststructure.getAdapter().getCount() , Toast.LENGTH_LONG).show(); 

    } 

    private void checkPermissions() { 

     if (Build.VERSION.SDK_INT >= 23) { 
      int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this, 
        Manifest.permission.READ_EXTERNAL_STORAGE); 
      if (permissionCheck != PackageManager.PERMISSION_GRANTED) { 
       ActivityCompat.requestPermissions(MainActivity.this, 
         new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_GRANTED_BY_USER); 
      }else{ 
       getInfoFromDevice(); 
      } 
     }else{ 
      getInfoFromDevice(); 
     } 
    } 
    void getInfoFromDevice() { 
     uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
     Cursor cursor = getContentResolver().query(uri, STAR, MUSIC_STRING, null, null); 

     if (cursor != null) 

     { 
      if (cursor.moveToFirst()) { 
       do { 
        String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)); 
        String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)); 
        String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM)); 
        String albumID = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)); 
        listOfSongs.add(name); 
       } while (cursor.moveToNext()); 
      } 

     Log.d("COUNT","COUNT is " + listOfSongs.size()); 
     } 
     listOfSongs.size(); 
    } 
} 

SongList.java

public class SongsList extends BaseAdapter { 

    ArrayList<String> songs; 
    Context c; 

    SongsList(Context c, ArrayList<String> songs) 
    { 
     this.c=c; 
     this.songs = songs; 
    } 


    @Override 
    public int getCount() { 
     return songs.size(); 
    } 

    @Override 
    public Object getItem(int i) { 
     return songs.get(i); 
    } 

    @Override 
    public long getItemId(int i) { 
     return i; 
    } 

    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) { 

     TextView tv; 
     ViewHolder vh; 
     LayoutInflater inflater = (LayoutInflater) 
       c.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 

     if(view ==null) 
     { 
      view = inflater.inflate(R.layout.green,viewGroup,false); 
      vh = new ViewHolder(view); 
      view.setTag(vh); 
      vh.tv.setText(songs.get(i)); 
     } 
     else{ 
      vh = (ViewHolder) view.getTag(); 
     } 
     return view; 
    } 
} 

我也尝试了下面的问题,

Duplicated entries in ListView

结果:我已经实施了这个。

Android ListView Duplicates entries

结果:这没有奏效。

All elements of An ArrayList change when a new one is added?

结果:无循环和对象创建的代码。

ListView Duplicates Android

结果:已经实现了这一点。

任何人都可以告诉我为什么是listview显示重复?

回答

0

我认为解决的办法其实是在你链接到第一个答案。

试着改变你的代码是这样的:

if(view ==null) 
    { 
     view = inflater.inflate(R.layout.green,viewGroup,false); 
     vh = new ViewHolder(view); 
     view.setTag(vh); 
     vh.tv.setText(songs.get(i)); 
    } 
    else{ 
     vh = (ViewHolder) view.getTag(); 
     vh.tv.setText(songs.get(i)); 
    } 

else语句,你打算重用包括已经创建了一个观点,但是你仍然需要在该视图来更新数据。

+0

'vh.tv.setText(songs.get(i));'实际上工作。 –

0

您需要的时候认为已经存在设置文本视图内容:

} else { 
    vh = (ViewHolder) view.getTag(); 
    vh.tv.setText(songs.get(i)); 
} 
+0

我只是忽略了代码,非常感谢您指出。 –