首页 > 解决方案 > 显示一项活动的项目列表

问题描述

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import java.util.ArrayList;
public class DataAdapter extends ArrayAdapter {
    private int mColorResourceId;
    public DataAdapter(@NonNull Context context, ArrayList<Data> resource ,int ColorResourceId) {
        super(context,0, resource);
    mColorResourceId =  ColorResourceId ;
    }
    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        View listitem = convertView;
        if( listitem == null){
            listitem = LayoutInflater.from(getContext()).inflate(R.layout.list_item,parent,false);
        }
        Data currentword = (Data) getItem(position);
        TextView pd = (TextView) listitem.findViewById(R.id.placetxt);
        pd.setText(currentword.getPlaceWord());
        View textContainer = listitem.findViewById(R.id.list_item);
        // Find the color that the resource ID maps to
        int color = ContextCompat.getColor(getContext(), mColorResourceId);
        // Set the background color of the text container View
        textContainer.setBackgroundColor(color);
        return listitem;
    }



 import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import java.io.Serializable;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements Serializable {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView topAttraction = (TextView) findViewById(R.id.topAttraction);
        topAttraction.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent topIntent = new Intent(MainActivity.this,TopAttraction.class);
                topIntent.putExtra("attraction" , getTopAttraction());
                startActivity(topIntent);
            }
        });
        TextView hosbitals = (TextView) findViewById(R.id.hosbitals);
        hosbitals.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent hosbitalsIntent = new Intent(MainActivity.this,Hospital.class);
                startActivity(hosbitalsIntent);
            }
        });
        TextView resturant = (TextView) findViewById(R.id.resturants);
        resturant.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent resturantIntent = new Intent(MainActivity.this,Resturants.class);
                startActivity(resturantIntent);
            }
        });
        TextView publicplaces = (TextView) findViewById(R.id.publicplaces);
        publicplaces.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent placesIntent = new Intent(MainActivity.this,PublicPlaces.class);
                startActivity(placesIntent);
            }
        });
        TextView buses= (TextView) findViewById(R.id.buses);
        buses.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent busesIntent = new Intent(MainActivity.this,BusesNumbers.class);
                startActivity(busesIntent);
            }
        });
    }
    public ArrayList<Data> getTopAttraction(){
        ArrayList<Data> attraction = new ArrayList<>();
        attraction.add(new Data("Search for Treasures in the Khan al-Khalili."));
        attraction.add(new Data("Hit the Beach and Splash in the Red Sea."));
        attraction.add(new Data("Admire Ancient Antiquities at the Egyptian Museum."));
        attraction.add(new Data("Explore Temples, Temples and More Temples."));
        attraction.add(new Data("Take a Sunset Felucca Ride in Aswan."));
        attraction.add(new Data("Experience Alexandria’s European Flair."));
        attraction.add(new Data("Mix and Mingle with Friendly Locals."));
        attraction.add(new Data("It’s one of the cheapest destinations you can travel to."));
        attraction.add(new Data("Our world-famous museums."));
        attraction.add(new Data("Camping in the Sahara Desert."));
        attraction.add(new Data("Religious significance for the three Abrahamic religions -- Islam, Christianity and Judaism."));
        attraction.add(new Data("Ancient whale fossils in the desert."));
        attraction.add(new Data("Kitesurfing."));
        attraction.add(new Data("10,000 year old rock art."));
        attraction.add(new Data("Egyptian food."));
        attraction.add(new Data("Egypt is a great winter destination. And summer for that matter. \nBasically, it’s an all-year destination."));
        return attraction;
    }
}

class Data {
    private String placeWord;

    public Data(String thePlace){
        placeWord = thePlace;
    }
    public String getPlaceWord(){
        return placeWord;
    }


import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
public class TopAttraction extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_items);
        ArrayList<Data> attraction = new ArrayList<Data>();
        attraction = (ArrayList<Data>)getIntent().getSerializableExtra("attraction");
        DataAdapter adapte = new DataAdapter(this,attraction,R.color.category_attraction);
        ListView listView = (ListView) findViewById(R.id.list);
        listView.setAdapter(adapte);
    }
}

我有 4 个类别,当用户单击其中一个类别时,我需要,TopAttraction 活动显示数据“数组列表吸引力”。我尝试实现可序列化,但是当我运行应用程序时它停止了,我知道什么时候我想使用意图发送数据我应该使用 putExtra 方法,我尝试了更多但仍然没有工作

10-06 14:04:44.928 13643-13643/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 13643
java.lang.RuntimeException: Parcel: unable to marshal value com.example.myapplication.Data@6aad433
    at android.os.Parcel.writeValue(Parcel.java:1397)
    at android.os.Parcel.writeList(Parcel.java:738)
    at android.os.Parcel.writeValue(Parcel.java:1344)
    at android.os.Parcel.writeArrayMapInternal(Parcel.java:665)
    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1330)
    at android.os.Bundle.writeToParcel(Bundle.java:1079)
    at android.os.Parcel.writeBundle(Parcel.java:690)
    at android.content.Intent.writeToParcel(Intent.java:7797)
    at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2676)
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1624)
    at android.app.Activity.startActivityForResult(Activity.java:3927)
    at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:676)
    at android.app.Activity.startActivityForResult(Activity.java:3888)
    at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:663)
    at android.app.Activity.startActivity(Activity.java:4211)
    at android.app.Activity.startActivity(Activity.java:4179)
    at com.example.myapplication.MainActivity$1.onClick(MainActivity.java:21)
    at android.view.View.performClick(View.java:5226)
    at android.view.View$PerformClick.run(View.java:21266)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:168)
    at android.app.ActivityThread.main(ActivityThread.java:5845)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)

标签: javaandroidarraylistserializable

解决方案


Data类必须是 Serializable 或 Parcelable。对于 Android Parcelable 是推荐的。

    class Data implements Parcelable {
    private String placeWord;

    public Data(String thePlace){
        placeWord = thePlace;
    }
    public String getPlaceWord(){
        return placeWord;
    }

    protected Data(Parcel in) {
        placeWord = in.readString();
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(placeWord);
    }

    @SuppressWarnings("unused")
    public static final Parcelable.Creator<Data> CREATOR = new Parcelable.Creator<Data>() {
        @Override
        public Data createFromParcel(Parcel in) {
            return new Data(in);
        }

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

  

或者

class Data implements Serializable {
    private String placeWord;

    public Data(String thePlace) {
        placeWord = thePlace;
    }

    public String getPlaceWord() {
        return placeWord;
    }
}

推荐阅读