Item点击跳转view
作业目标
在作业一的基础上,将recyclerView的每个item增加点击功能,点击后跳转到一个新的view展示信息
技术说明
-
Android Studio
-
Pixel 3a API 34
-
Adapter
-
RecyclerView
关键代码
静态布局
新建tab02_item.xml文件
在layout下新建一个xml文件,实现recyclerview中每个item的样式设计
新建MyAdapter类
创建Adapter类,将数据绑定到recyclerview中对应的Item上
代码:
package com.example.mychat; import android.content.Context; import android.content.Intent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import java.util.List; import java.util.Map; public class MyAdapter extends RecyclerView.Adapter <MyAdapter.MyViewHolder>{ //定义存储数据和运行环境的变量 private List<Map<String,Object>> mydata; private Context mycontext; //获取数据和运行环境 public MyAdapter(List<Map<String,Object>> data, Context context){ mydata=data; mycontext=context; } @NonNull @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view= LayoutInflater.from(mycontext).inflate(R.layout.tab02_item,parent,false); MyViewHolder holder=new MyViewHolder(view); return holder; } @Override public void onBindViewHolder(@NonNull MyAdapter.MyViewHolder holder, int position) { //获取点击位置的对应数据 String name=mydata.get(position).get("i_name").toString(); int image=Integer.parseInt(mydata.get(position).get("i_image").toString()); //将此数据显示到item中 holder.textView.setText(name); holder.imageView.setImageResource(image); } @Override public int getItemCount() { return mydata.size(); } public class MyViewHolder extends RecyclerView.ViewHolder { private TextView textView; private ImageView imageView; public MyViewHolder(@NonNull View itemView) { super(itemView); //获取item中的控件id textView=itemView.findViewById(R.id.text_666); imageView=itemView.findViewById(R.id.image_666); } } }
修改Fragment2
因为上次的列表效果不是很满意,这次进行重新的修改。同时也对bottom栏图标进行了更换,更美观囖。
代码:
package com.example.mychat; import android.content.Context; import android.graphics.Color; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; public class Fragment2 extends Fragment { //获取recyclerView对象并且实例化适配器 private RecyclerView recyclerView; private MyAdapter myAdapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment //return inflater.inflate(R.layout.fra_lx, container, false); View view; //存所有控件的视图 view=inflater.inflate(R.layout.tab02, container, false); //调用recycleview控件 recyclerView=view.findViewById(R.id.recycleview); //创建数据 String[] names={"Felicity","Novocaine 2","rainy road","风(wind)","Windy Hill","至少还有你","The rain & lovers","How Long"}; int[] images={R.drawable.no1, R.drawable.no2, R.drawable.no3, R.drawable.no4,R.drawable.no5, R.drawable.no6,R.drawable.no7,R.drawable.no8}; String[] composer={"Isaac Shepard","Cloke/Shiloh Dynasty","CHINESE","陈越龙","羽肿", "林忆莲","The rain & lovers","Charlie Puth"}; String[] album={"Deep Joy","Novocaine 2","Rainy road","Apr.四月","Windy Hill","爱的主题曲 十七岁的天空","rainy days", "Voicenotes"}; String[] tags={"纯音乐","静谧","独白","治愈","轻音乐", "华语","小众","欧美"}; List<Map<String,Object>> items=new ArrayList<Map<String,Object>>(); for(int i=0;i<names.length;i++){ Map<String,Object> item=new HashMap<String, Object>(); item.put("i_name",names[i]); item.put("i_image",images[i]); item.put("i_songer",composer[i]); item.put("i_song",album[i]); item.put("i_tag",tags[i]); items.add(item); } //创建RecycleView实例和设置Adapter Context context=getContext(); myAdapter=new MyAdapter(items,context); LinearLayoutManager manager=new LinearLayoutManager(context); manager.setOrientation(recyclerView.VERTICAL); recyclerView.setLayoutManager(manager); recyclerView.setAdapter(myAdapter); //实现拖拽和左滑删除效果 ItemTouchHelper itemTouchHelper=new ItemTouchHelper(new ItemTouchHelper.Callback() { @Override public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { int swiped=ItemTouchHelper.LEFT; int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; return makeMovementFlags(dragFlags,swiped); } @Override public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { int oldPosition = viewHolder.getAdapterPosition(); int newPosition = target.getAdapterPosition(); if (oldPosition < newPosition) { for (int i = oldPosition; i < newPosition; i++) { // 改变数据集 Collections.swap(items, i, i +1); } } else { for (int i = oldPosition; i > newPosition; i--) { // 改变数据集 Collections.swap(items, i, i - 1); } } myAdapter.notifyItemMoved(oldPosition, newPosition); return true; } @Override public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { int position = viewHolder.getAdapterPosition(); items.remove(position); myAdapter.notifyItemRemoved(position); } @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { if (actionState!=ItemTouchHelper.ACTION_STATE_IDLE){ viewHolder.itemView.setBackgroundColor(Color.parseColor("#04BE02")); } } @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); viewHolder.itemView.setBackgroundColor(Color.TRANSPARENT); } }); //关联recycleView itemTouchHelper.attachToRecyclerView(recyclerView); return view; } }
效果图:
item跳转实现
新建tab02_details
目的是实现各个item布局的页面展示
修改MyAdapter类
主要修改onBindViewHolder中的方法,其他地方不做更改
代码:
@Override public void onBindViewHolder(@NonNull MyAdapter.MyViewHolder holder, int position) { String name=mydata.get(position).get("i_name").toString(); int image=Integer.parseInt(mydata.get(position).get("i_image").toString()); //获取详情页面中某个联系人的对应数据 String songer=mydata.get(position).get("i_songer").toString(); String song=mydata.get(position).get("i_song").toString(); String tag=mydata.get(position).get("i_tag").toString(); holder.textView.setText(name); holder.imageView.setImageResource(image); //添加点击事件 holder.textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //点击后跳转到联系人详情页 Intent intent=new Intent(mycontext,Fragment2Detail.class); //向intent传值 intent.putExtra("details",name); intent.putExtra("image",image); intent.putExtra("songer",songer); intent.putExtra("song",song); intent.putExtra("tag",tag); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //开始跳转 mycontext.startActivity(intent); } }); }
新建Fragment2Detail的Activity
用来接收Fragment2的数据以传给MyAdapter,获取item控件的值。
代码:
package com.example.mychat; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; public class Fragment2Detail extends AppCompatActivity { TextView dName,textView1,textView2,textView3; ImageView dImage; Button button_r; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tab02_details); //获取上一个Actvity传过来的intent Intent intent=getIntent(); dName=findViewById(R.id.textDetail); dImage=findViewById((R.id.imageDetail)); //根据intent获取得到的数据设置item控件的值 dImage.setImageResource(intent.getIntExtra("image",R.drawable.wode)); dName.setText(intent.getStringExtra("details")); textView1=findViewById(R.id.songer2); textView2=findViewById(R.id.song2); textView3=findViewById(R.id.wxtag2); textView1.setText(intent.getStringExtra("songer")); textView2.setText(intent.getStringExtra("song")); textView3.setText(intent.getStringExtra("tag")); button_r=findViewById(R.id.returnButton); button_r.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(); setResult(666,intent); finish(); } }); } }
结果展示
总结
这次作业,主要利用自定义MyAdapter控件实现了对点击事件触发的页面跳转。通过设置intent对象进行跳转,传递上下两个Activity,并设置返回值来进行两个Activity页面之间的跳转。注意在新建Activity类时,需要在Manifest文件中写注册信息,一开始我就没写,结果点击页面老是闪退。