移动作业2:Item点击跳转view


Item点击跳转view

作业目标

在作业一的基础上,将recyclerView的每个item增加点击功能,点击后跳转到一个新的view展示信息

技术说明

  • Android Studio

  • Pixel 3a API 34

  • Adapter

  • RecyclerView

关键代码

静态布局

新建tab02_item.xml文件

在layout下新建一个xml文件,实现recyclerview中每个item的样式设计

图片.png

新建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;
    }
}

效果图:

图片.png

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();
            }
        });
    }
}

结果展示

s.gif

总结

这次作业,主要利用自定义MyAdapter控件实现了对点击事件触发的页面跳转。通过设置intent对象进行跳转,传递上下两个Activity,并设置返回值来进行两个Activity页面之间的跳转。注意在新建Activity类时,需要在Manifest文件中写注册信息,一开始我就没写,结果点击页面老是闪退。

源码地址

GitHub - Drizzle042425/AS: 存放AS源码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值