Android Studio-实现列表跳转

一、作业目标


        基于上一个作业实现的微信类门户界面,当点击第一个界面的列表时,进入另一个界面并给出文本提示。


二、设计流程

1.外观设计


        将第一个界面的列表进行优化,item.xml加入一个imageview ;
        把Fragment1中的列表循环去掉,修改成自己想要显示的文本;

        点击某一行文本后,跳转到另一个页面,并且出现一行文字提示。


2.内部联系


        在fragment1.java中写列表要显示的文本,Myadapter.java中写intent 的内容,传到textview_Activity.java中,textview _Activity.java用getintent()接收内容并在每一个textview 中显示出来,从而实现点击一则消息,启动textview_Activity.java跳转进入消息页面。

三、技术说明及关键代码
1、展示字符串列表

           Fragment1.java这个代码基本没有修改只是把循环进行了修改,如下图。之后创建一个Myadapter对象,并将它绑定到 RecyclerView 中,在创建Myadapter对象时,将list变量作为参数传递给了它。

list = new ArrayList();

list.add("小兔子的消息来咯" );
list.add("大兔子邀请你一起听音乐");

完整代码:

package com.example.myapplication;
import android.content.Context;
        import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;

        import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
        import android.view.ViewGroup;
        import androidx.appcompat.app.AppCompatActivity;
        import androidx.recyclerview.widget.LinearLayoutManager;
        import androidx.recyclerview.widget.RecyclerView;

        import java.util.ArrayList;
        import java.util.List;

public class  Fragment1 extends Fragment {

    RecyclerView recyclerView;

    List list;
    Myadapter myadapter;
    Context context;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.tab1, container, false);
        context = view.getContext();

       recyclerView = view.findViewById(R.id.recyclerView);

        list = new ArrayList();

        list.add("小兔子的消息来咯" );
        list.add("大兔子邀请你一起听音乐");

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

        return view;
    }

}
2、将数据绑定到控件上

        Myadapter.java是实现了一个简单的 RecyclerView,用于展示文本列表,在用户点击列表项时启动另一个 Activity。

        主要是在原来基础上增加了onBindViewHolder()方法,它为每个item中的 TextView 设置了文本内容,并为其添加了一个点击事件监听器,点击每一行的TextView 时,就会启动textview_Activity.java,并将 "耶比耶比"(自己想要的文本)传递给这个 Activity。

//绑定数据到MyHolder中
    @Override
    public void onBindViewHolder(@NonNull Myholder holder, int position) {
        holder.textView.setText(list1.get(position));
        holder.textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Context context = holder.itemView.getContext();
                Intent intent1 = new Intent(context,textview_Activity.class);
                intent1.putExtra("qq", "耶比耶比");
                context.startActivity(intent1);
            }
        });
    }

完整代码:

package com.example.myapplication;

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

public class Myadapter extends RecyclerView.Adapter<Myadapter.Myholder>{
    Context context1;
    List<String> list1;
    public Myadapter(Context context, List<String> list){
        context1 = context;
        list1 = list;
    }

    //创建实例
    @NonNull
    @Override
    public Myholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context1).inflate(R.layout.item,parent,false);
        Myholder holder=new Myholder(view);
        return holder;
    }
    //绑定数据到MyHolder中
    @Override
    public void onBindViewHolder(@NonNull Myholder holder, int position) {
        holder.textView.setText(list1.get(position));
        holder.textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Context context = holder.itemView.getContext();
                Intent intent1 = new Intent(context,textview_Activity.class);
                intent1.putExtra("qq", "耶比耶比");
                context.startActivity(intent1);
//
//        Intent intent = new Intent(context,textview_return.class);
//        intent.putExtra("name", "是猫Y");
//        intent.putExtra("svt17", "可爱鼠啦");
//        context.startActivity(intent);
            }
        });
    }
    //返回数据集集合的大小
    @Override
    public int getItemCount() {

        return list1.size();
    }



    //用于保存item布局中的控件引用
    public class Myholder extends RecyclerView.ViewHolder {
        TextView textView;
        public Myholder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.item);
        }
    }

}
3、获取另一个页面要展示的文本

         getIntent用来获取传递给textview_Activity.java的字符串参数 ,并将其设置为要显示的textview的文本的内容。

        String name1=getIntent().getStringExtra("qq");
        textView1=findViewById(R.id.item);
        textView1.setText(name1);

完整代码:

package com.example.myapplication;

import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;


public class textview_Activity extends AppCompatActivity {
    //Button button44;

    TextView textView1,textView2,textView3;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.item);


//        Intent intent = new Intent(textview_Activity.this,textview_return.class);
//        intent.putExtra("name", "是猫Y");
//        intent.putExtra("age", 1);
//        intent.putExtra("svt17", "可爱鼠啦");
//        intent.putExtra("fighting!", 1);
//        intent.putExtra("无穷花开了", "下雨啦");
//        startActivity(intent);
        String name1=getIntent().getStringExtra("qq");
        textView1=findViewById(R.id.item);
        textView1.setText(name1);

        Log.d("svt", "onCreate...");

    }
    @Override
    protected void onPostResume() {
        super.onPostResume();
        Log.d("svt", "onPostResume...");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("svt", "onResume...");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d("svt", "onStart...");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d("svt", "onStop...");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("svt", "onDestroy...");
    }
}
4、控件的改造

        我只对原来的item.xml进行了修改,可按个人喜好,其中 android:src="@drawable/rabit" />是在drawable文件夹下保存了一个rabit.png图片。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#F4D6D6"
    android:backgroundTint="#FFD2D2"
    android:gravity="center">

    <ImageView
        android:id="@+id/imageView4"
        android:layout_width="302dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:src="@drawable/rabit" />

    <TextView
        android:id="@+id/item"
        android:layout_width="470dp"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:layout_weight="1"
        android:gravity="center"
        android:text="message"
        android:textColor="#1C82FF"
        android:textSize="24sp" />

</LinearLayout>
5、优化

1、本代码无论点击第一行还是第二行列表,返回界面的文本提示都是“耶比耶比”,如果想传回来的不同,可以修改Myadapter.java,修改“耶比耶比”,把position直接作为value,这样返回的就是你点击的那一句文本了(两种方法如下)。

//                Context context = holder.itemView.getContext();
//                Intent intent1 = new Intent(context1,textview_Activity.class);
//                intent1.putExtra("qq", "耶比耶比");
//                context.startActivity(intent1);

                Context context = holder.itemView.getContext();
                Intent intent1 = new Intent(context1,textview_Activity.class);
                intent1.putExtra("qq", list1.get(position));
                context1.startActivity(intent1);

2、如果想要自己定义文本,可以自己写一个类,类的方法里面直接返回传进来的值,把自己想要展示的内容传到类里面,再把“耶比耶比”那一句改成类的调用,这样value就可以是不同的值。我请教朋友的,自己还在实现中。

四、结果展示

五、遇到的问题及解决

1、下面第一句里的“qq”,必须和第二句自己在Fragment1.java中写的名字一样,否则显示就会是空白的。

String name1=getIntent().getStringExtra("qq");

intent1.putExtra("qq", "耶比耶比");

2、Mainifest里面必须给出声明Activity!不要因为是“false”就觉得可以不写,否则运行后和没写一样。

3、我本来的思路是想写两个Activity,在第一个Activity写intent内容,在第二个Activity接收,并用不同的textview来接收展示内容,最后出现的结果就是直接从第一个界面跳到第三个界面,因为Fragment1已经跳转到了textview_Acticity,我再跳转到另一个activity,就会出现跳转两次的情况。于是我把另一个Activity及相关的intent内容删除了。

六、线上仓库地址

luo17_world: 学习移动开发技术课程时创建 (gitee.com)

猜你喜欢

转载自blog.csdn.net/m0_73786116/article/details/134363926