【问题标题】:Duplicates in listview - Android [duplicate]列表视图中的重复项 - Android [重复]
【发布时间】:2016-09-27 11:04:06
【问题描述】:

我在列表视图中得到重复值,但我确信我正在使用的列表中没有重复值。

这是下面的代码,

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

结果:已经实现了。

谁能告诉我为什么列表视图显示重复项?

【问题讨论】:

    标签: android listview baseadapter


    【解决方案1】:

    我认为解决方案实际上在您链接到的第一个答案中。

    尝试将您的代码更改为:

    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 语句中,您正在重用已创建的视图,但您仍需要更新该视图中的数据。

    【讨论】:

    • vh.tv.setText(songs.get(i)); 确实有效。
    【解决方案2】:

    当视图已经存在时,需要设置文本视图内容:

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

    【讨论】:

    • 我只是忽略了代码,非常感谢您指出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2013-10-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多