使用Android Studio中的意图将数据从主要活动传递到另一个活动

问题描述 投票:0回答:2

使用Intents将数据从主要活动传递到另一个活动时,我遇到了问题。我制作了MainActivityBaiHat classSecondActivity以便从MainActivity中获取数据。

打开logcat,出现这样的错误:

((java.lang.NullPointerException:尝试调用虚拟方法空对象上的'java.lang.String java.lang.Object.toString()'参考在com.myappnvt.truyendulieu.MainActivity $ 1.onItemClick(MainActivity.java:30)处MainActivity.java:30是行“字符串ten_bai_hat = listView.getItemAtPosition(position).toString();“

这里是代码:

 package com.myappnvt.truyendulieu;

import android.os.Parcel;
import android.os.Parcelable;

import java.lang.reflect.Array;

public class BaiHat implements Parcelable {
    private String tenBaiHat;
    private int tenFile;

    public BaiHat(String tenBaiHat, int tenFile) {
        this.tenBaiHat = tenBaiHat;
        this.tenFile = tenFile;
    }

    public BaiHat(Parcel in) {
        tenBaiHat = in.readString();
        tenFile = in.readInt();
    }

    public static final Creator<BaiHat> CREATOR = new Creator<BaiHat>() {
        @Override
        public BaiHat createFromParcel(Parcel in) {
            return new BaiHat(in);
        }

        @Override
        public BaiHat[] newArray(int size) {
            return new BaiHat[size];
        }
    };

    public String getTenBaiHat() {
        return tenBaiHat;
    }

    public void setTenBaiHat(String tenBaiHat) {
        this.tenBaiHat = tenBaiHat;
    }

    public int getTenFile() {
        return tenFile;
    }

    public void setTenFile(int tenFile) {
        this.tenFile = tenFile;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(tenBaiHat);
        dest.writeInt(tenFile);

    }
    public  static final Parcelable.Creator<BaiHat> creator = new Parcelable.Creator<BaiHat>(){
        public BaiHat createFromParcel(Parcel in){
            return new BaiHat(in);
        }
        public BaiHat[] newArray (int size){
            return  new BaiHat[size];
        }
    };
}
    package com.myappnvt.truyendulieu;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

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

public class MainActivity extends AppCompatActivity {
    BaiHatAdapter adapter;
    ListView listView;
    ArrayList<BaiHat> baiHatArrayList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Addlist();
        adapter = new BaiHatAdapter(MainActivity.this, R.layout.dong_bai_hat, baiHatArrayList);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String ten_bai_hat = listView.getItemAtPosition(position).toString();
                startActivity(new Intent(getApplicationContext(),SecondActivity.class)
                        .putExtra("BAIHAT", baiHatArrayList)
                .putExtra("TENBAIHAT", ten_bai_hat)
                .putExtra("POSITION",position));
            }
        });


    }
    private void Addlist(){
        listView = (ListView) findViewById(R.id.listViewdanhsach);
        baiHatArrayList = new ArrayList<>();
        baiHatArrayList.add(new BaiHat("Bến tương tư - Quang Linh", R.raw.ben_tuong_tu_quang_linh));
        baiHatArrayList.add(new BaiHat("Buồn trong kỷ niệm - Đan Nguyên", R.raw.buon_trong_ky_niem_dan_nguyen));
        baiHatArrayList.add(new BaiHat("Cát bụi cuộc đời - Phi Nhung", R.raw.cat_bui_cuoc_doi_phi_nhung));
        baiHatArrayList.add(new BaiHat("Cho vừa lòng em - Như Nguyệt", R.raw.cho_vua_long_em_nhu_nguyet));
        baiHatArrayList.add(new BaiHat("Chuyến đò không em - Tuấn Vũ", R.raw.chuyen_do_khong_em_tuan_vu));

    }
}
    package com.myappnvt.truyendulieu;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;

import java.util.ArrayList;

public class SecondActivity extends AppCompatActivity {
    String bai_hat ="";
    int vi_tri =0;
    TextView txtlaydulieu;
    ArrayList<BaiHat> baiHatArrayList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        txtlaydulieu = (TextView) findViewById(R.id.textViewlaydulieu);
        Intent intent = getIntent();
        Bundle bundle = intent.getExtras();
        baiHatArrayList = (ArrayList) bundle.getParcelableArrayList("BAIHAT");
        bai_hat = baiHatArrayList.get(vi_tri).getTenBaiHat().toString();
        String songName = intent.getStringExtra("TENBAIHAT");
        txtlaydulieu.setText(songName);
        txtlaydulieu.setSelected(true);
        vi_tri = bundle.getInt("POSITION",0);
        Uri uri = Uri.parse(baiHatArrayList.get(vi_tri).toString());
        MediaPlayer  mediaPlayer = MediaPlayer.create(getApplicationContext(), uri);
        mediaPlayer.start();
    }
}
java android arraylist android-intent parcelable
2个回答
0
投票

您能否尝试获得这样的物品。除了从适配器中获取列表之外,您还可以像belo这样检索源。该错误显示nullpointer异常,这意味着您没有从适配器获取数据。因此,请尝试以下一次。

String ten_bai_hat = baiHatArrayList.get(position).toString();

完整代码:

public class MainActivity extends AppCompatActivity {
BaiHatAdapter adapter;
ListView listView;
ArrayList<BaiHat> baiHatArrayList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Addlist();
    adapter = new BaiHatAdapter(MainActivity.this, R.layout.dong_bai_hat, baiHatArrayList);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String ten_bai_hat = baiHatArrayList.get(position).toString();
            startActivity(new Intent(getApplicationContext(),SecondActivity.class)
                    .putExtra("BAIHAT", baiHatArrayList)
            .putExtra("TENBAIHAT", ten_bai_hat)
            .putExtra("POSITION",position));
        }
    });


}
private void Addlist(){
    listView = (ListView) findViewById(R.id.listViewdanhsach);
    baiHatArrayList = new ArrayList<>();
    baiHatArrayList.add(new BaiHat("Bến tương tư - Quang Linh", R.raw.ben_tuong_tu_quang_linh));
    baiHatArrayList.add(new BaiHat("Buồn trong kỷ niệm - Đan Nguyên", R.raw.buon_trong_ky_niem_dan_nguyen));
    baiHatArrayList.add(new BaiHat("Cát bụi cuộc đời - Phi Nhung", R.raw.cat_bui_cuoc_doi_phi_nhung));
    baiHatArrayList.add(new BaiHat("Cho vừa lòng em - Như Nguyệt", R.raw.cho_vua_long_em_nhu_nguyet));
    baiHatArrayList.add(new BaiHat("Chuyến đò không em - Tuấn Vũ", R.raw.chuyen_do_khong_em_tuan_vu));

}

}


0
投票

尝试像这样实现您的BaiHatAdapter

public class BaiHatAdapter extends ArrayAdapter {
    public BaiHatAdapter(@NonNull Context context, int layout, int textViewId, @NonNull List<BaiHat> objects) {
        super(context, layout, textViewId, objects);
    }

    @Nullable
    @Override
    public Object getItem(int position) {
        BaiHat item = (BaiHat) super.getItem(position);
        return (item != null && item.getTenBaiHat() != null) ? item.getTenBaiHat() : "Default TenBaiHat Text";
    }
}

[textViewId-将显示TextView文本的ten_ba_hat的ID。

© www.soinside.com 2019 - 2024. All rights reserved.