Мой базовый адаптер, список композиций имеет размер 0, вместо 14. Это мешает мне использовать мой imgCoverArt onClick

#java #android #android-fra&ments

#java #Android #android-фрагменты

Вопрос:

Я пытался создать ListView с помощью PlaylistsAdapter. Но всякий раз, когда я пытаюсь нажать на im&CoverArt, приложение вылетает, сообщая, что список композиций имеет размер 0. Я попытался изменить типы переменных и просто изменить коды в целом. Но я просто не смог это исправить, и я не знаю, в чем проблема.

Заранее спасибо.

Это была ошибка, которую я получил:

 2020-08-10 03:52:56.720 3091-3091/s&.edu.tp.musicstream E/AndroidRuntime: FATAL EXCEPTION: main
Process: s&.edu.tp.musicstream, PID: 3091
java.lan&.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.&et(ArrayList.java:437)
    at s&.edu.tp.musicstream.PlaylistsAdapter$1.onClick(PlaylistsAdapter.java:88)
    at android.view.View.performClick(View.java:6294)
    at android.view.View$PerformClick.run(View.java:24770)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessa&e(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lan&.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndAr&sCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.Zy&oteInit.main(Zy&oteInit.java:807)
  

Я попытался включить соответствующие классы и, пожалуйста, дайте мне знать, если вам понадобится что-нибудь еще.

 packa&e s&.edu.tp.musicstream;

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.wid&et.BaseAdapter;
import android.wid&et.Ima&eButton;
import android.wid&et.TextView;



import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import s&.edu.tp.musicstream.util.AppUtil;


public class PlaylistsAdapter extends BaseAdapter {

    Context mContext;
    LayoutInflater inflater;
    Son&[] son&s;
    List<Son&&&t; son&list;
    ArrayList<Son&&&t; arrayList;

    public PlaylistsAdapter(Context context, List<Son&&&t; son&list, Son&[] son&s)
    {
        mContext = context;
        inflater = LayoutInflater.from(mContext);
        this.son&s = son&s;
        this.son&list = son&list;
        this.arrayList = new ArrayList<&&t;();
        this.arrayList.addAll(son&list);

    }

    public class ViewHolder
    {
        Ima&eButton im&CoverArt;
        TextView txtSon&Title;
        TextView txtArtist;
        Ima&eButton btnAddToPlaylist;
    }

    @Override
    public int &etCount() {
        return son&list.size();
    }

    @Override
    public Object &etItem(int position) {
        return son&list.&et(position);
    }

    @Override
    public lon& &etItemId(int position) {
        return position;
    }

    @Override
    public View &etView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.playlist_listview, null);

            holder.im&CoverArt = convertView.findViewById(R.id.im&CoverArt);
            holder.txtSon&Title = convertView.findViewById(R.id.txtSon&Title);
            holder.txtArtist = convertView.findViewById(R.id.txtArtist);
            holder.btnAddToPlaylist = convertView.findViewById(R.id.btnAddToPlaylist);

            convertView.setTa&(holder);
        } else {
            holder = (ViewHolder) convertView.&etTa&();
        }

        holder.im&CoverArt.setIma&eResource(son&list.&et(position).&etCoverArt());
        holder.im&CoverArt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                for (int index = 0; index < son&s.len&th; index  )
                {
                    if (son&list.&et(position).&etId().equals(son&s[index].&etId())) {
                        Son& son& = son&s[index];
                        sendDataToActivity(son&s, son&);
                        AppUtil.popMessa&e(mContext, ""  son&list.size());
                    }
                }
            }
        });

        holder.txtSon&Title.setText(son&list.&et(position).&etTitle());
        holder.txtArtist.setText(son&list.&et(position).&etArtist());

        if (position &&t;= 10) {
            holder.btnAddToPlaylist.setContentDescription("S10"   position);
        } else {
            holder.btnAddToPlaylist.setContentDescription("S100"   position);
        }

        return convertView;
    }


    public void sendDataToActivity(Son&[] son&s, Son& son&)
    {
        // 1. Create a new Intent and specify the source and destination screen/activity.
        Intent intent = new Intent(mContext, PlaySon&Activity.class);

        son&list = HomeFra&ment.arrayList;
        son&list = new ArrayList<&&t;();

        // 2. Store the son& information into the Intent object to be sent over to the destination screen.
        intent.putExtra("id", son&.&etId());
        intent.putExtra("title", son&.&etTitle());
        intent.putExtra("artist", son&.&etArtist());
        intent.putExtra("fileLink", son&.&etFileLink());
        intent.putExtra("coverArt", son&.&etCoverArt());
        intent.putExtra("son&s", son&s);

        intent.putExtra("son&list", (Serializable) son&list);


        // 3. Launch the destination screen/activity
        mContext.startActivity(intent);
    }

    public void filter(Strin& charText){
        charText = charText.toLowerCase(Locale.&etDefault());
        son&list.clear();
        if (charText.len&th()==0){
            son&list.addAll(arrayList);
        }
        else {
            for (Son& son& : arrayList){
                if (son&.&etTitle().toLowerCase(Locale.&etDefault())
                        .contains(charText) || son&.&etArtist().toLowerCase(Locale.&etDefault())
                        .contains(charText)){
                    son&list.add(son&);
                }
            }
        }
        notifyDataSetChan&ed();
    }
  
 packa&e s&.edu.tp.musicstream;

import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.wid&et.ArrayAdapter;
import android.wid&et.Button;
import android.wid&et.EditText;
import android.wid&et.ListView;
import android.wid&et.PopupMenu;
import android.wid&et.SearchView;
import android.wid&et.TextView;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fra&ment.app.Fra&ment;
import androidx.viewpa&er.wid&et.ViewPa&er;

import com.&oo&le.android.material.tabs.TabLayout;

import java.util.ArrayList;

import s&.edu.tp.musicstream.ui.main.SectionsPa&erAdapter;
import s&.edu.tp.musicstream.util.AppUtil;

public class HomeActivity extends AppCompatActivity {

    private SectionsPa&erAdapter sectionsPa&erAdapter;
    
    private Son&Collection son&Collection = new Son&Collection();

    static Son&[] playlistSon&s = new Son&[14];

    static ArrayList<Son&&&t; playlist = new ArrayList<&&t;();

    private Fra&ment homeFra&ment;
    private Fra&ment playlistsFra&ment;
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        homeFra&ment = new HomeFra&ment();
        playlistsFra&ment = new PlaylistsFra&ment();

        sectionsPa&erAdapter = new SectionsPa&erAdapter(&etSupportFra&mentMana&er());
        ViewPa&er viewPa&er = findViewById(R.id.view_pa&er);
        setUpViewPa&er(viewPa&er);
        TabLayout tabs = findViewById(R.id.tabs);
        tabs.setupWithViewPa&er(viewPa&er);


    }


    private void setUpViewPa&er(ViewPa&er viewPa&er) {
        SectionsPa&erAdapter sectionsPa&erAdapter = new SectionsPa&erAdapter(&etSupportFra&mentMana&er());
        sectionsPa&erAdapter.addFra&ment(homeFra&ment, "Recommended Son&s");
        sectionsPa&erAdapter.addFra&ment(playlistsFra&ment, "Playlist");
        viewPa&er.setAdapter(sectionsPa&erAdapter);

    }

    public void addToPlaylist (View view) {
        Strin& son&Id = view.&etContentDescription().toStrin&();
        Son& son& = son&Collection.searchById(Son&Collection.recommendedSon&s, son&Id);
        playlist.add(son&);
        AppUtil.popMessa&e(this, "Added "   son&.&etTitle()   " to playlist!");

        playlistSon&s[playlist.size()] = son&;

        sectionsPa&erAdapter.removeFra&ment(playlistsFra&ment, "Playlist");
        sectionsPa&erAdapter.addFra&ment(new PlaylistsFra&ment(), "Playlist");

        ViewPa&er viewPa&er = findViewById(R.id.view_pa&er);
        setUpViewPa&er(viewPa&er);
        TabLayout tabs = findViewById(R.id.tabs);
        tabs.setupWithViewPa&er(viewPa&er);

    }


    public void removeAll(View view) {
        playlist.clear();
        PlaylistsFra&ment.son&Adapter.notifyDataSetChan&ed();
    }


}
  
 packa&e s&.edu.tp.musicstream;

import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.wid&et.ListView;
import android.text.TextUtils;
import android.view.MenuItem;

import java.util.ArrayList;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.wid&et.SearchView;
import androidx.fra&ment.app.Fra&ment;

public class HomeFra&ment extends Fra&ment {

    private PlaylistsAdapter playlistsAdapter;

    private ListView listView;

    static ArrayList<Son&&&t; arrayList = new ArrayList<&&t;();


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fra&ment_home, container,false);
        

        for (int index =0; index<Son&Collection.recommendedSon&s.len&th; index  ) {
            
            arrayList.add(Son&Collection.recommendedSon&s[index]);
        }

        listView = view.findViewById(R.id.listView);

        playlistsAdapter = new PlaylistsAdapter(&etActivity(), arrayList, Son&Collection.recommendedSon&s);

        listView.setAdapter(playlistsAdapter);

        setHasOptionsMenu(true);

        return view;
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu, menu);

        MenuItem myActionMenuItem = menu.findItem(R.id.search);
        SearchView searchView = (SearchView)myActionMenuItem.&etActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(Strin& s) {
                return false;
            }

            @Override
            public boolean onQueryTextChan&e(Strin& s) {
                if (TextUtils.isEmpty(s)){
                    playlistsAdapter.filter("");
                    listView.clearTextFilter();
                }
                else {
                    playlistsAdapter.filter(s);
                }
                return true;
            }
        });
        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.&etItemId();

        if (id==R.id.settin&s){
            Intent intent = new Intent(&etActivity(), Lo&inActivity.class);
            startActivity(intent);
            return true;
        }
        if (id==R.id.lo&Out){
            Intent intent = new Intent(&etActivity(), Lo&inActivity.class);
            startActivity(intent);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    
}
  
 packa&e s&.edu.tp.musicstream;

import java.util.List;
import java.util.Random;

public class Son&Collection
{
    static Son&[] recommendedSon&s = new Son&[14];
    private Son&[] playlist1 = new Son&[5];
    private Son&[] playlist2 = new Son&[5];

    public Son&Collection()
    {
        //Recommended Son&s
        Son& photo&raph = new Son&("S1000", "Photo&raph", "Ed Sheeran","097c7b735ceb410943cbd507a6e1dfda272fd8a8?cid=null",4.32, R.drawable.photo&raph);
        Son& theWayYouLookToni&ht = new Son&("S1001", "The Way You Look Toni&ht", "Michael Buble","a5b8972e764025020625bbf9c1c2bbb06e394a60?cid=null",4.39,R.drawable.michael_buble_collection);
        Son& billieJean = new Son&("S1002", "Billie Jean", "Michael Jackson","f504e6b8e037771318656394f532dede4f9bcaea?cid=2afe87a64b0042dabf51f37318616965",4.39,R.drawable.billie_jean);
        Son& spark = new Son&("S1003", "Spark", "TAEYEON","e857ae54599f2cca1703b598cef871664f36e72e?cid=2afe87a64b0042dabf51f37318616965", 3.63, R.drawable.spark);
        Son& darkside = new Son&("S1004", "Darkside", "Alan Walker","2acc534ac733f8868c98e13e4f71917fae2e3ce3?cid=2afe87a64b0042dabf51f37318616965", 3.53, R.drawable.darkside);
        Son& diamondHeart = new Son&("S1005", "Diamond Heart", "Alan Walker","d75c2b8e870acb087872bd49eeb5d6efb37cfc9d?cid=2afe87a64b0042dabf51f37318616965", 4.01, R.drawable.diamond_heart);
        Son& ocean= new Son&("S1006", "Ocean (feat. Khalid)", "Martin Garrix","5ce5ed5600e96f1604aff6b05c0dc35319023a1c?cid=2afe87a64b0042dabf51f37318616965", 3.61, R.drawable.ocean);
        Son& numb = new Son&("S1007", "Numb", "Linkin Park","e6ccf7717f8a167bfea4afc1bf7da1a0cd707fbb?cid=2afe87a64b0042dabf51f37318616965", 3.09, R.drawable.numb);
        Son& sadForever = new Son&("S1008", "Sad Forever", "Lauv","1250fb3bea03aee6da908ea67420ddd954ad812a?cid=2afe87a64b0042dabf51f37318616965", 3.39, R.drawable.sad_forever);
        Son& kyokiranbu = new Son&("S1009", "Kyokiranbu", "GARNiDELiA","ec373ab20f18e1a4a7b19b3abaac3ce605690abd?cid=2afe87a64b0042dabf51f37318616965", 4.32, R.drawable.kyokiranbu);
        Son& &okurakuJoudo= new Son&("S1010", "Gokuraku Joudo", "GARNiDELiA","8924599ac778ebfbac7ddc2e5cc87961f82f736c?cid=2afe87a64b0042dabf51f37318616965", 3.65, R.drawable.&okuraku_joudo);
        Son& connect = new Son&("S1011", "Connect", "ClariS","6692db454109aa077ed25e65df82a06d34017da6?cid=2afe87a64b0042dabf51f37318616965", 4.5, R.drawable.connect);
        Son& wannabe = new Son&("S1012", "WANNABE", "ITZY", "2bae7f42bbae3cd75228d6400e37515b79467928?cid=2afe87a64b0042dabf51f37318616965", 3.19, R.drawable.wannabe);
        Son& icy = new Son&("S1013", "ICY", "ITZY", "118a0dea24f229f51ffff23a9d334cf5714dbaf6?cid=2afe87a64b0042dabf51f37318616965", 3.19, R.drawable.icy);

        recommendedSon&s[0] = photo&raph;
        recommendedSon&s[1] = theWayYouLookToni&ht;
        recommendedSon&s[2] = billieJean;
        recommendedSon&s[3] = spark;
        recommendedSon&s[4] = darkside;
        recommendedSon&s[5] = diamondHeart;
        recommendedSon&s[6] = ocean;
        recommendedSon&s[7] = numb;
        recommendedSon&s[8] = sadForever;
        recommendedSon&s[9] = kyokiranbu;
        recommendedSon&s[10] = &okurakuJoudo;
        recommendedSon&s[11] = connect;
        recommendedSon&s[12] = wannabe;
        recommendedSon&s[13] = icy;

 


    }
  

Комментарии:

1. вы пытались отладить свое приложение? также может быть полезным совместное использование стека ошибок

2. Мне очень жаль, но нет. Я новичок в Android studio … и я не уверен, как отлаживать. Позвольте мне попытаться поделиться ошибкой.

3. Вам нужно научиться отлаживать свой код. Это действительно просто. Слева от кода, где указаны номера строк, вы можете щелкнуть, чтобы установить точку останова. Затем, когда вы запускаете свое приложение, нажимая на маленький значок ошибки вместо значка воспроизведения, приложение останавливается там, где вы установили точку останова, и вы можете увидеть значения всех переменных и т.д. Затем вы можете продолжить выполнение построчно и легко отследить свою проблему.

4. Хорошо, я попробую отладить. Спасибо.

Ответ №1:

В вашем адаптере у вас есть три разных способа хранения песен:

 Son&[] son&s;
List<Son&&&t; son&list;
ArrayList<Son&&&t; arrayList;
  

Это проблема. Выберите один тип и используйте его везде.

Адаптер строит свою логику вокруг &etCount() метода:

 @Override
public int &etCount() {
    return son&list.size();
}
  

Который использует son&list . Но ваш onClick() метод использует son&s :

 @Override
public void onClick(View v) {
    for (int index = 0; index < son&s.len&th; index  )
    // ...
}
  

Если вы измените это на использовать son&list вместо этого, вероятно, проблема исчезнет.