Передача данных, связанных с ячейкой ListView, в другое действие onClick () элемента - PullRequest
0 голосов
/ 07 сентября 2018

Я новичок в программировании Android. Я пишу простое музыкальное приложение, используя ListView и пользовательский макет. Каждая строка в списке содержит два TextView's для названия песни и имени исполнителя.

У меня есть два действия, MainActivity и nowPlaying Activity, в nowPlaying Activity есть список, который также имеет два TextView's. Чего я хочу достичь, так это когда я нажимаю на элемент в ListView (в разделе «Основные действия»), я хочу получить название песни и имя исполнителя и установить его на TextView's в игровой деятельности nowPlaying.

MainActivity

public class MainActivity extends AppCompatActivity {

ListView listView;
ArrayList<Songs> song;

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

    song = new ArrayList<Songs>();
    song.add(new Songs("Shape of you", "ed sheeran", "4:59"));
    song.add(new Songs("Energy", "avelino", "3:15"));
    song.add(new Songs("Wages", "bad sounds", "2:56"));
    song.add(new Songs("L'Hiver Indien", "baloji", "3:28"));
    song.add(new Songs("Faded Heart", "Borns", "4:59"));
    song.add(new Songs("King Ruby", "ider", "4:59"));
    song.add(new Songs("Drown", "kovic", "4:59"));
    song.add(new Songs("Supercut", "lorde", "4:59"));
    song.add(new Songs("&Run", "sir sly", "4:59"));
    song.add(new Songs("Live in the moment", "portugal. the man", "4:59"));

    SongAdapter adapter = new SongAdapter(this, song);

    listView = findViewById(R.id.list_view);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            TextView songName = findViewById(R.id.song_name);
            TextView artistName = findViewById(R.id.artist);
            Intent intent = new Intent(MainActivity.this, nowPlaying.class);
            intent.putExtra("name", listView.getItemAtPosition(i).toString());
            startActivity(intent);
        }
    });
    listView.setAdapter(adapter);
}

}

SongAdapter

public class SongAdapter extends ArrayAdapter<Songs> {


public SongAdapter(Activity context, ArrayList<Songs> song) {
    // Here, we initialize the ArrayAdapter's internal storage for the context and the list.
    // the second argument is used when the ArrayAdapter is populating a single TextView.
    // Because this is a custom adapter for two TextViews and an ImageView, the adapter is not
    // going to use this second argument, so it can be any value. Here, we used 0.
    super(context, 0, song);
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    //return super.getView(position, convertView, parent);
    View listItemView = convertView;
    if (listItemView == null) {
        listItemView = LayoutInflater.from(getContext()).inflate(
                R.layout.song_item, parent, false);
    }

    Songs currentSong = getItem(position);

    TextView songName = listItemView.findViewById(R.id.song_name);
    songName.setText(currentSong.getSongName());

    TextView artistName = listItemView.findViewById(R.id.artist);
    artistName.setText(currentSong.getArtistName());

    TextView time = listItemView.findViewById(R.id.time);
    time.setText(currentSong.geTime());

    return listItemView;
}
}

Скриншот

На скриншоте (указанном выше) каждая строка имеет имя для песни, а другое - для исполнителя. При щелчке по строке я хочу получить имя, задать его для другого действия и сделать то же самое для имени исполнителя.

Я хочу, чтобы это происходило с каждым элементом в ListView.

SongsClass

public class Songs {
private String mSongName;
private String mArtistName;
private String mTime;

public Songs(String songName, String artistName, String Time) {
    mSongName = songName;
    mArtistName = artistName;
    mTime = Time;
}

public String getSongName() {
    return mSongName;
}
public String getArtistName() {
    return mArtistName;
}

public String geTime() {
    return mTime;
}

}

Ответы [ 5 ]

0 голосов
/ 07 сентября 2018

Примечание Просто создайте класс модели Songs с помощью метода получения и установки songName и artistName И просто получите данные в NowPlayingActivcty по назначению

public class MainActivity extends AppCompatActivity {

ListView listView;
ArrayList<Songs> song;

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

  final song = new ArrayList<Songs>();
    song.add(new Songs("Shape of you", "ed sheeran", "4:59"));
    song.add(new Songs("Energy", "avelino", "3:15"));
    song.add(new Songs("Wages", "bad sounds", "2:56"));
    song.add(new Songs("L'Hiver Indien", "baloji", "3:28"));
    song.add(new Songs("Faded Heart", "Borns", "4:59"));
    song.add(new Songs("King Ruby", "ider", "4:59"));
    song.add(new Songs("Drown", "kovic", "4:59"));
    song.add(new Songs("Supercut", "lorde", "4:59"));
    song.add(new Songs("&Run", "sir sly", "4:59"));
    song.add(new Songs("Live in the moment", "portugal. the man", "4:59"));

    SongAdapter adapter = new SongAdapter(this, song);

    listView = findViewById(R.id.list_view);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            TextView songName = findViewById(R.id.song_name);
            TextView artistName = findViewById(R.id.artist);
            Intent intent = new Intent(MainActivity.this, nowPlaying.class);
            intent.putExtra("songName", listView.get(i).getsongName());
            intent.putExtra("artistName", listView.get(i).getartistName());
            startActivity(intent);
        }
    });
    listView.setAdapter(adapter);
}
0 голосов
/ 07 сентября 2018

Вы хотите передать некоторые данные (в вашем случае название песни и имя исполнителя ) для какой-либо другой деятельности. Таким образом, это может быть достигнуто путем передачи желаемых данных через намерения, потому что намерения являются объектами обмена сообщениями, и вы можете помещать в них небольшие куски данных для передачи между действиями. Так что код для того же:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            TextView songName = view.findViewById(R.id.song_name);
            TextView artistName = view.findViewById(R.id.artist);
            Intent intent = new Intent(MainActivity.this, nowPlaying.class);
            intent.putExtra("song_name", songName.getText().toString());
            intent.putExtra("artist_name", artistName.getText().toString());
            startActivity(intent);
        }
    });

Представление , данное в методе onItemClick (), представляет собой представление, по которому был выполнен щелчок (возвращенный адаптером), чтобы вы получили его содержимое и передали его другому действию в том виде, как оно есть.

Альтернативный способ:

Вы не можете получить доступ к списку (список песен Array) внутри onItemCLick () , если он не объявлен как final . Таким образом, вы можете объявить его следующим образом и получить к нему доступ:

final ArrayList<Songs> songs = new ArrayList<Songs>() {{
    add(new Songs("Shape of you", "ed sheeran", "4:59"));
    add(new Songs("Energy", "avelino", "3:15"));
    add(new Songs("Wages", "bad sounds", "2:56"));
    add(new Songs("L'Hiver Indien", "baloji", "3:28"));
    add(new Songs("Faded Heart", "Borns", "4:59"));
    add(new Songs("King Ruby", "ider", "4:59"));
    add(new Songs("Drown", "kovic", "4:59"));
    add(new Songs("Supercut", "lorde", "4:59"));
    add(new Songs("&Run", "sir sly", "4:59"));
    add(new Songs("Live in the moment", "portugal. the man", "4:59"));
}}

Теперь вы можете использовать этот список песен для получения данных в методе onItemClick () следующим образом:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Intent intent = new Intent(MainActivity.this, nowPlaying.class);
                intent.putExtra("song_name", songs.get(i).getSongName()); // Note: If the getters are not set to get the song name and artist name then they need to be set to use this approach
                intent.putExtra("artist_name", songs.get(i).getArtistName());
                startActivity(intent);
            }
        });
0 голосов
/ 07 сентября 2018

вот как исправить на клик если вам нужно отправить объект песни, ищите, как превратить ваш класс песен в пакет для отправки

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
       String song_name= song.get(i).getSongName().toString();
        Intent intent = new Intent(MainActivity.this, nowPlaying.class);
        intent.putExtra("name",song_name );
        startActivity(intent);
    }
});
enter code here
0 голосов
/ 07 сентября 2018

Измените это (listView.getItemAtPosition (i) .toString ()) на songName или artistName.

и получите это в своей второй активности.

0 голосов
/ 07 сентября 2018

Вы делаете правильные вещи, все, что вам нужно добавить, это имя и артист в статистах, и вернуть их из второго упражнения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...