Android Studio-实现RecycleView的点击跳转

一、设计目标

二、功能说明

        在聊天页面中,点击某一消息列时,会跳转到其详情页。聊天列表包含联系人的头像与姓名,消息详情页包含联系人的头像姓名以及聊天信息

三、效果展示

        

        

四、技术说明

  • Intent

  • Intent是一个将要执行的动作的抽象的描述,一般作为参数来使用,由 Intent来协助完成 Android各个组件之间的通讯。例如调用startActivity()来启动一个Activity,使用构造方法:Intent intent = new Intent(this, SecondActivity.class);startActivity(intent);

五、设计流程

  • 聊天列表 item.xml

        

  • 消息详情页

  • activity_talk.xml

        

具体代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:src="@drawable/girl1" />

        <TextView
            android:id="@+id/name"
            android:layout_width="279dp"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="TextView"
            android:textColor="@color/blue"
            android:textSize="35dp" />
    </LinearLayout>

    <TextView
        android:id="@+id/info"
        android:layout_width="match_parent"
        android:layout_height="523dp"
        android:gravity="center"
        android:text="TextView"
        android:textSize="50dp" />

</LinearLayout>
  • Activity_talk.java

  • 设置点击跳转后显示的详情页面,通过Intent获取到的数据设置item控件的值。
public class Activity_talk extends AppCompatActivity {
    TextView textView1,textView2;
    ImageView imageView1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_talk);
        textView1 = findViewById(R.id.name);
        textView2 = findViewById(R.id.info);
        imageView1 = findViewById(R.id.imageView);

        //获取Fragment1传过来的intent
        Intent intent=getIntent();

        //根据intent获取得到的数据设置item控件的值
        imageView1.setImageResource(intent.getIntExtra("image",R.drawable.girl1));
        textView1.setText(intent.getStringExtra("friend"));
        textView2.setText(intent.getStringExtra("message"));


    }
}
  • 聊天页面 Fragment1.java

  • 在聊天页面Fragment1设置聊天列表RecycleView的具体内容,包括联系人姓名、聊天消息、联系人头像。
public class Fragment1 extends Fragment {
    RecyclerView recyclerView;
    Myadapter myadapter;
    View view1;
    Context context;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        view1=new View(getContext());

        view1= inflater.inflate(R.layout.fragment1, container, false);
        recyclerView= view1.findViewById(R.id.recyclerview);

        //聊天页面展示
        //friends:联系人  info:消息  images:联系人头像
        String[] friends = {"叶苏","白榆","胡杨","林竹","江叙","陈冀","楚安","许然","邱望","白景"};
        String[] info = { "你好。","再见。","谢谢。","早上好。","今天天气真好。",
                "你吃饭了吗?","明天见。","是真的吗?","原来如此。","你说得对。",};
        int[] images={R.drawable.girl1,R.drawable.girl2,R.drawable.man1,R.drawable.girl3,R.drawable.man2,
                R.drawable.man3,R.drawable.man4,R.drawable.girl4,R.drawable.girl5,R.drawable.man5};

        //将friend、info、images聚合为一个集合
        List<Map<String,Object>> talk2=new ArrayList<Map<String,Object>>();
        for(int i=0;i<friends.length;i++) {
            Map<String,Object> it=new HashMap<String,Object>();
            it.put("friend",friends[i]);
            it.put("message",info[i]);
            it.put("image",images[i]);
            talk2.add(it);
        }

        context=getContext();
        myadapter=new Myadapter(talk2,context);
        recyclerView.setAdapter(myadapter);
        LinearLayoutManager manager=new LinearLayoutManager(view1.getContext());
        manager.setOrientation(RecyclerView.VERTICAL);
        recyclerView.setLayoutManager(manager);

        return view1;
    }
}
  • Myadapter.java

  • 在onBindViewHolder中增加消息页详情,并通过Intent实现页面跳转。
 public void onBindViewHolder(@NonNull Myholder holder, int position) {
        //holder.textView1.setText(talk1.get(position).get("friend").toString());
        String name=talk1.get(position).get("friend").toString();
        String info=talk1.get(position).get("message").toString();
        int image=Integer.parseInt(talk1.get(position).get("image").toString());
        //获取聊天页面中某个消息详情
        holder.textView1.setText(name);
        holder.imageView1.setImageResource(image);
        //添加点击事件
        holder.textView1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击后跳转到消息详情页
                Intent intent=new Intent(context1,Activity_talk.class);
                //向intent传值
                intent.putExtra("friend",name);
                intent.putExtra("message",info);
                intent.putExtra("image",image);

                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                //跳转
                context1.startActivity(intent);
            }
        });
    }
<think>好的,用户想在Android Studio中使用RecycleView实现查询手机联系人的功能。首先,我需要回忆一下相关的步骤和组件。RecycleView通常用于显示列表数据,而联系人列表正好适合这种结构。用户可能需要访问系统的联系人数据,所以需要权限处理,比如请求READ_CONTACTS权限。 接下来,可能需要使用ContentResolver来查询联系人数据库。记得Android的联系人数据是通过ContentProvider提供的,所以需要使用正确的URI和投影。然后,将查询到的数据映射到RecycleView的适配器中,可能需要自定义一个Adapter,继承自RecyclerView.Adapter,并实现ViewHolder。 另外,用户可能需要处理点击事件,比如点击联系人跳转到详情页面,这涉及到RecycleView的Item点击监听,可以通过在Adapter中设置接口回调来实现。同时,权限请求需要在运行时处理,尤其是在Android 6.0及以上版本,需要在代码中动态请求权限。 还要考虑布局文件的编写,包括RecycleView的布局和每个列表项的布局。可能需要使用LinearLayoutManager来管理布局方式。最后,确保所有步骤都符合Android开发的最佳实践,比如在后台线程处理数据查询,避免主线程阻塞。 还需要检查是否有遗漏的步骤,比如在AndroidManifest.xml中添加权限声明,正确处理数据游标的关闭,防止内存泄漏。可能还需要处理空数据的情况,显示适当的提示信息。总之,整个过程需要综合运用权限处理、ContentResolver查询、RecycleView配置和适配器设计等知识点。</think>在Android Studio中通过RecycleView实现手机联系人列表功能,需要以下步骤: ### 一、准备工作 1. 在`AndroidManifest.xml`添加权限: ```xml <uses-permission android:name="android.permission.READ_CONTACTS" /> ``` 2. 创建联系人数据模型类: ```java public class Contact { private String name; private String phone; // 构造方法/getter/setter } ``` ### 二、实现联系人查询 使用`ContentResolver`查询联系人数据: ```java private List<Contact> getContacts() { List<Contact> contacts = new ArrayList<>(); Cursor cursor = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null ); if (cursor != null) { while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME )); String phone = cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER )); contacts.add(new Contact(name, phone)); } cursor.close(); } return contacts; } ``` ### 三、配置RecycleView 1. 创建列表项布局`item_contact.xml`: ```xml <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp"> <TextView android:id="@+id/tvName" android:layout_width="0dp" android:layout_weight="1" android:textSize="16sp"/> <TextView android:id="@+id/tvPhone" android:textSize="14sp"/> </LinearLayout> ``` 2. 实现适配器: ```java public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ViewHolder> { private List<Contact> contacts; public static class ViewHolder extends RecyclerView.ViewHolder { TextView tvName, tvPhone; public ViewHolder(View itemView) { super(itemView); tvName = itemView.findViewById(R.id.tvName); tvPhone = itemView.findViewById(R.id.tvPhone); } } @Override public void onBindViewHolder(ViewHolder holder, int position) { Contact contact = contacts.get(position); holder.tvName.setText(contact.getName()); holder.tvPhone.setText(contact.getPhone()); } } ``` ### 四、权限处理 在Activity中动态请求权限: ```java if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, PERMISSIONS_REQUEST_READ_CONTACTS); } else { initRecyclerView(); } ``` ### 五、整合实现 在Activity中初始化RecycleView: ```java private void initRecyclerView() { RecyclerView recyclerView = findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(this)); ContactAdapter adapter = new ContactAdapter(getContacts()); recyclerView.setAdapter(adapter); } ``` **技术要点说明**: 1. 使用`CursorLoader`可以在后台线程加载联系人数据(更优方案) 2. 需要处理`onRequestPermissionsResult`回调[^5] 3. 可添加点击事件实现拨号功能: ```java holder.itemView.setOnClickListener(v -> { Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:" + contact.getPhone())); startActivity(intent); }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值