#android #url #android-recyclerview #onclicklistener
#Android #url #android-recyclerview #onclicklistener
Вопрос:
В моем onBindViewHolder я передаю OnClickListener в itemview в представлении recycler. Itemview состоит из массива с изображением и текстом; Основное действие
public class MainActivity extends AppCompatActivity {
private AdView mAdView;
private AdView mAdView2;
private static final String TAG = MainActivity.class.getSimpleName();
private RecyclerView firstrecyclerView;
private RecyclerView thirdrecyclerView;
ArrayList<itemModel> items;
String[] iconName = {"ABP Sanjha","Breaking News Punjab","Republic Bharat", "Al Jazeera","DW News","Sky News","Indus Live","CNA","RT News"};
//cannel icons and names
private String[] channelnames={"PTC Punjabi","Chakde TV","T-Series Punjabi", "9X Tashan", "Zee Punjabi" };
private int[] channelimages={R.drawable.ptcpunjabi, R.drawable.chakde, R.drawable.tseries, R.drawable.ninex, R.drawable.zeepunjabi};
private String[] channelID={"UCHJW1_0oPzYZl89wX_jhrgA","UCaT-WGdJLyEDnxZPAKRTbqQ","UCJMSoNjSKRARSIJM3GymRjQ","UCrET5fR2NAUTO2Xp12G0l8A", "UCYF_LfBBxkFBEgaSCNrqW3w"};
private List<channel> channelList=new ArrayList<>();
//youtube player fragment
private YouTubePlayerSupportFragmentX youTubePlayerFragment;
private ArrayList<String> youtubeVideoArrayList;
private YouTubePlayer youTubePlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
generateDummyVideoList();
initializeYoutubePlayer();
setUpRecyclerView();
populateRecyclerView();
MobileAds.initialize(this, new OnInitializationCompleteListener() {
@Override
public void onInitializationComplete(InitializationStatus initializationStatus) {
}
});
mAdView = findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
mAdView2 = findViewById(R.id.adView2);
AdRequest adRequest2 = new AdRequest.Builder().build();
mAdView2.loadAd(adRequest2);
}
/**
* initialize youtube player via Fragment and get instance of YoutubePlayer
*/
private void initializeYoutubePlayer() {
youTubePlayerFragment = (YouTubePlayerSupportFragmentX) getSupportFragmentManager().findFragmentById(R.id.youtube_player_fragment);
if (youTubePlayerFragment == null)
return;
youTubePlayerFragment.initialize(Constants.DEVELOPER_KEY, new YouTubePlayer.OnInitializedListener() {
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player,
boolean wasRestored) {
if (!wasRestored) {
youTubePlayer = player;
//set the player style default
youTubePlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.DEFAULT);
//cue the 1st video by default
youTubePlayer.cueVideo(youtubeVideoArrayList.get(0));
youTubePlayer.addFullscreenControlFlag(YouTubePlayer.FULLSCREEN_FLAG_ALWAYS_FULLSCREEN_IN_LANDSCAPE);
}
}
@Override
public void onInitializationFailure(YouTubePlayer.Provider arg0, YouTubeInitializationResult arg1) {
//print or show error if initialization failed
Log.e(TAG, "Youtube Player View initialization failed");
}
});
}
// setup the recycler view here
private void setUpRecyclerView() {
firstrecyclerView = findViewById(R.id.first_recycler_view);
firstrecyclerView.setHasFixedSize(true);
items = new ArrayList<>();
//Horizontal direction recycler view
LinearLayoutManager firstlinearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
firstrecyclerView.setLayoutManager(firstlinearLayoutManager);
firstrecyclerView.setItemAnimator(new DefaultItemAnimator());
for (int i = 0; i < iconName.length; i ) {
itemModel itemModel = new itemModel(iconName[i], youtubeVideoArrayList.get(i));
items.add(itemModel);
}
thirdrecyclerView=findViewById(R.id.third_recycler_view);
thirdrecyclerView.setHasFixedSize(true);
channelList=new ArrayList<>();
LinearLayoutManager thirdlinearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
thirdrecyclerView.setLayoutManager(thirdlinearLayoutManager);
for (int i=0;i < channelnames.length;i ){
channel channel=new channel(channelnames[i],channelimages[i]);
channelList.add(channel);
}
}
//populate the recycler view and implement the click event here
private void populateRecyclerView() {
final CustomAdapter adapterf = new CustomAdapter(this, items);
firstrecyclerView.setAdapter(adapterf);
//set click event
firstrecyclerView.addOnItemTouchListener(new RecyclerViewOnClickListener(this, new RecyclerViewOnClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
if (youTubePlayerFragment != null amp;amp; youTubePlayer != null) {
//update selected position
adapterf.setSelectedPosition(position);
//load selected video
youTubePlayer.cueVideo(youtubeVideoArrayList.get(position));
}
}
}));
channeladpater channeladpater=new channeladpater(channelList);
thirdrecyclerView.setAdapter(channeladpater);
}
//method to generate dummy array list of videos
private void generateDummyVideoList() {
youtubeVideoArrayList = new ArrayList<>();
//get the video id array from strings.xml
String[] videoIDArray = getResources().getStringArray(R.array.video_id_array);
//add all videos to array list
Collections.addAll(youtubeVideoArrayList, videoIDArray);
}
}
Теперь я попытался открыть другое действие при нажатии на itemview таким образом;
класс channeladapter;
public class channeladpater extends RecyclerView.Adapter<channeladpater.Channelviewholder> {
private List<channel> channelList;
Context ctx;
public channeladpater(List<channel> channelList) {
this.channelList=channelList;
}
@NonNull
@Override
public Channelviewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view,parent,false);
return new Channelviewholder(view);
}
@Override
public void onBindViewHolder(@NonNull Channelviewholder holder, int position)
{
final channel channel=channelList.get(position);
holder.channelname.setText(channel.getChannelname());
holder.channelimage.setImageResource(channel.getChannelimage());
holder.setItemClickListener(new ItemClickListener() {
@Override
public void onItemClickListener(View v, int position) {
final String[] channelID={"UCHJW1_0oPzYZl89wX_jhrgA","UCaT-WGdJLyEDnxZPAKRTbqQ","UCJMSoNjSKRARSIJM3GymRjQ","UCrET5fR2NAUTO2Xp12G0l8A", "UCYF_LfBBxkFBEgaSCNrqW3w"};
Intent intent=MainActivity2.newIntent(v.getContext(), channelID);
v.getContext().startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return channelList.size();
}
public static class Channelviewholder extends RecyclerView.ViewHolder implements View.OnClickListener{
public TextView channelname;
public CircleImageView channelimage;
ItemClickListener itemClickListener;
Channelviewholder(@NonNull View itemView) {
super(itemView);
this.channelname=itemView.findViewById(R.id.profile_name);
this.channelimage=itemView.findViewById(R.id.profile_image);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
this.itemClickListener.onItemClickListener(v,getLayoutPosition());
}
public void setItemClickListener(ItemClickListener ic){
this.itemClickListener=ic;
}
}
}
}
начало нового действия — это, по сути, список видео, извлеченных с помощью API данных YouTube;
MainActivity2
public class MainActivity2 extends AppCompatActivity {
RecyclerView recyclerView;
ArrayList<VideoDetails> videoDetailsoArrayList;
public static String CHANNEL_ID_EXTRA = "channel_id_extra";
public static Intent newIntent(Context context, String[] channelID) {
return new Intent(context, MainActivity2.class).putExtra(CHANNEL_ID_EXTRA, channelID);
}
String API_Key = "AIzaSyA1_spJ4XGWOCekBLCsSAgWderHHl_46m0";
private String[] channelID={"UCHJW1_0oPzYZl89wX_jhrgA","UCaT-WGdJLyEDnxZPAKRTbqQ","UCJMSoNjSKRARSIJM3GymRjQ","UCrET5fR2NAUTO2Xp12G0l8A", "UCYF_LfBBxkFBEgaSCNrqW3w"};
String url="https://www.googleapis.com/youtube/v3/search?part=snippetamp;channelId=" Arrays.toString(channelID) "amp;maxResults=50amp;sort=dateamp;key=AIzaSyA1_spJ4XGWOCekBLCsSAgWderHHl_46m0";
adapter adapter;
Context ctx;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
final String channelID = getIntent().getStringExtra(CHANNEL_ID_EXTRA);
recyclerView=findViewById(R.id.listView);
videoDetailsoArrayList= new ArrayList<>();
adapter=new adapter(MainActivity2.this,videoDetailsoArrayList);
displayVideos();
}
private void displayVideos ()
{
RequestQueue requestQueue= Volley.newRequestQueue(this);
StringRequest stringRequest=new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
JSONArray jsonArray = jsonObject.getJSONArray("items");
for (int i = 0; i < jsonArray.length(); i ) {
JSONObject jsonObject1 = jsonArray.getJSONObject(i);
if (jsonObject1.has("id")){
JSONObject jsonVideoId=jsonObject1.getJSONObject("id");
if (jsonVideoId.has("kind")){
if(jsonVideoId.getString("kind").equals("youtube#video")) {
JSONObject jsonObjectSnippet = jsonObject1.getJSONObject("snippet");
JSONObject jsonObjectDefault = jsonObjectSnippet.getJSONObject("thumbnails").getJSONObject("medium");
String video_id = jsonVideoId.getString("videoId");
VideoDetails vd = new VideoDetails();
vd.setVideoId(video_id);
vd.setTitle(jsonObjectSnippet.getString("title"));
vd.setDescription(jsonObjectSnippet.getString("description"));
vd.setUrl(jsonObjectDefault.getString("url"));
videoDetailsoArrayList.add(vd);
}
}
}
}
}catch (JSONException e) {
e.printStackTrace();
}
recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
adapter= new adapter(getApplicationContext(),videoDetailsoArrayList);
recyclerView.setAdapter(adapter);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(),error.getMessage(), LENGTH_LONG).show();
}
});
requestQueue.add(stringRequest);
}
Теперь я пытаюсь изменить идентификатор канала из строкового URL-адреса MainActivity2 таким образом, чтобы при нажатии на itemview со строковыми именами каналов «PTC Punjabi» в MainActivity загружался идентификатор канала «UCHJW1_0oPzYZl89wX_jhrgA», при нажатии на названия каналов «Chakde Tv» в MainActivity2 загружался
идентификатор канала «UCaT- WGdJLyEDnxZPAKRTbqQ» и так далеевкл. но я не понимаю, как передать список channelId в MainActivity2?
Должен ли я объявлять массив channelId в MainActivity?. Пожалуйста, кто-нибудь, помогите мне на этом шаге. Я знаю, что решение невелико, поскольку я видел учебные пособия по действиям с кнопками, но я не могу понять, как передать URL-адрес другому действию.
класс модели канала
public class channel {
String channelname;
int channelimage;
public channel(String channelname, int channelimage) {
this.channelname = channelname;
this.channelimage = channelimage;
}
public String getChannelname() {
return channelname;
}
public int getChannelimage() {
return channelimage;
}
}
Ответ №1:
Прежде всего: не рекомендуется создавать Intent
где-то еще, затем действие, намерение которого вы создаете. Итак, вам нужно добавить статический метод в ваш MainActivity2:
public static String CHANNEL_ID_EXTRA = "channel_id_extra";
public static Intent newIntent(Context context, String channelID) {
return new Intent(context, MainActivity2.class).putExtra(CHANNEL_ID_EXTRA, channelID);
}
После этого вы можете получить этот идентификатор в onCreate()
методе с помощью :
final String channelId = getIntent().getStringExtra(CHANNEL_ID_EXTRA);
И теперь в держателе: ОТРЕДАКТИРОВАНО ЗДЕСЬ
@Override
public void onBindViewHolder(@NonNull Channelviewholder holder, int position) {
final channel channel=channelList.get(position);
holder.channelname.setText(channel.getChannelname());
holder.channelimage.setImageResource(channel.getChannelimage());
holder.setItemClickListener(new ItemClickListener() {
@Override
public void onItemClickListener(View v, int position) {
final String channelID= channelList.get(position);
Intent intent=MainActivity2.newIntent(v.getContext(), channelID);
v.getContext().startActivity(intent);
}
});
}
Комментарии:
1. но у меня есть список channelId .. Как объявить их заранее, чтобы каждый элемент этой строки присваивался на основе щелчка
2.
PTC punjabi UCHJW1_0oPzYZl89wX_jhrgA Chakde Tv UCaT-WGdJLyEDnxZPAKRTbqQ T-series punjabi UCJMSoNjSKRARSIJM3GymRjQ 9x tashan UCrET5fR2NAUTO2Xp12G0l8A zee punjabi UCYF_LfBBxkFBEgaSCNrqW3w
это список, который я хочу передать на 5 отдельных кликов3. это не присваивает никакого идентификатора
4. @summyiaharis как создать список элементов для вашего адаптера?
5. ` holder.setItemClickListener(новый ItemClickListener() { @Override public void OnItemClickListener(View v, int position) { последняя строка[] channelID={«UCHJW1_0oPzYZl89wX_jhrgA»,»UCaT-WGdJLyEDnxZPAKRTbqQ»,»UCJMSoNjSKRARSIJM3GymRjQ»,»UCrET5fR2NAUTO2Xp12G0l8A» , «UCYF_LfBBxkFBEgaSCNrqW3w»}; Намерение намерение=MainActivity2.newIntent(v.getContext(), channelId); v.getContext().startActivity(намерение); } }); `