【问题标题】:How to use an ArrayAdapter with Parcelables?如何将 ArrayAdapter 与 Parcelables 一起使用?
【发布时间】:2015-08-15 15:12:33
【问题描述】:

我正在尝试使用ListViewArrayAdapterParcelable 构建一个非常简单的示例。

在我的示例中,有一个Activity,用户在其中输入了他的姓名、地址和国家/地区。然后将这些数据打包并发送到第二个Activity。 (我知道我不需要包裹来发送这么多的数据,但我正在尝试用一个非常简单的例子来练习包裹)

在第二个Activity 中,数据显示在使用ArrayAdapterList 中。

我一遍又一遍地修改代码,尝试了各种示例,但仍然无法弄清楚我的代码有什么问题。有人可以帮帮我吗?

代码如下:

主要活动:

        package com.example.marcelshimabukuro.treino_lista_inflater_adapter_bean;

import android.content.Context;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.util.ArrayList;


public class MainActivity extends ActionBarActivity {

    public Context mContext;

    public EditText etNome, etEndereco, etPais;
    public Button mButton;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mContext = this;

        loadComponents();

        loadDadosDeUsuario();

        loadButtonActions();

    }


    private void loadComponents() {

        mButton = (Button) findViewById(R.id.btActivity2);

        etNome = (EditText) findViewById(R.id.etNome1);
        etEndereco = (EditText) findViewById(R.id.etEndereco1);
        etPais = (EditText) findViewById(R.id.etPais1);

    }

    public Usuarios[] loadDadosDeUsuario() {


        Usuarios[] usuariosArray = new Usuarios[3];

        for (int i = 0; i < 3; i++) {

            Usuarios usuarios = new Usuarios();

            //Pegar dados que usuario digitar no TextView e jogar no Array
            usuarios.setNome(etNome.getText().toString());
            usuarios.setEndereço(etEndereco.getText().toString());
            usuarios.setPais(etPais.getText().toString());

            usuariosArray[i] = usuarios;

        }

        return usuariosArray;


    }


    private void loadButtonActions() {

        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                //Mandar dados com Intent para outra actitivy
                //Instanciar var Intent
                Intent intent = new Intent(mContext, ListaActivity.class);

                //Colocar os extras no meu intent para mandar oara a proxima activity
                intent.putExtra("dadosdeusuario", loadDadosDeUsuario());

                //Iniciar nova activity
                startActivity(intent);

            }
        });



    }
}

用户活动:

package com.example.marcelshimabukuro.treino_lista_inflater_adapter_bean;

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

/**
 * Created by marcelshimabukuro on 7/25/15.
 */

//Classe Usuario para conter a minha estrutura de dados
public class Usuarios implements Parcelable {

    public String mNome, mEndereço, mPais;

    //Constructor
    public Usuarios() {

    }

    public String getNome() {
        return mNome;
    }

    public void setNome(String nome) {
        mNome = nome;
    }

    public String getEndereço() {
        return mEndereço;
    }

    public void setEndereço(String endereço) {
        mEndereço = endereço;
    }

    public String getPais() {
        return mPais;
    }

    public void setPais(String pais) {
        mPais = pais;
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(mNome);
        dest.writeString(mEndereço);
        dest.writeString(mPais);
    }


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

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

    protected Usuarios(Parcel in) {
        mNome = in.readString();
        mEndereço = in.readString();
        mPais = in.readString();
    }
}

列出活动:

package com.example.marcelshimabukuro.treino_lista_inflater_adapter_bean;

import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Parcelable;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Arrays;


public class ListaActivity extends ListActivity {

    public Context mContext;
    public ListView mListView;

    public Usuarios[] mUsuariosArray;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista);

        mContext = this;

        loadComponents();

        loadList();

        loadAdapter();

    }


    private void loadComponents() {

        mListView = (ListView) findViewById(R.id.lvLista3);

    }

    private void loadList() {

        Intent intent = getIntent();

        Parcelable[] parcelables = intent.getParcelableArrayExtra("dadosdeusuario");

       mUsuariosArray = Arrays.copyOf(parcelables, parcelables.length, Usuarios[].class);


    }

    private void loadAdapter() {

        ArrayList<Usuarios> usuariosArrayList = new ArrayList<Usuarios>();

        //Declarar var adapter
        ArrayAdapter adapter = new ArrayAdapter(this, usuariosArrayList);

        //Iniciar meu adapter
        mListView.setAdapter(adapter);



    }

}

适配器活动:

package com.example.marcelshimabukuro.treino_lista_inflater_adapter_bean;

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

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

/**
 * Created by marcelshimabukuro on 8/15/15.
 */
public class ArrayAdapter extends android.widget.ArrayAdapter<Usuarios> {

    public TextView mNome, mEndereço, mPais;

    //Constructor
    public ArrayAdapter(Context context, ArrayList<Usuarios> usuariosArrayList) {
        super(context,0 , usuariosArrayList);
    }



    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        //Pegar dado de cada item nesta posição
        Usuarios usuarios = getItem(position);

        //Se nenhuma view ja foi inflada
        if (convertView == null) {

            //Inflar a lista usando meu layout de itens
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.itens_de_lista, parent, false);
        }

        //Casting de meus objs de tela atrave da var converView
        mNome = (TextView) convertView.findViewById(R.id.tvNome);
        mEndereço = (TextView) convertView.findViewById(R.id.tvEndereço);
        mPais = (TextView) convertView.findViewById(R.id.tvPais);

        //o TextView da minha lista sera = ao valor da var String correspondente da classe Usuarios
        mNome.setText(usuarios.mNome);
        mEndereço.setText(usuarios.mEndereço);
        mPais.setText(usuarios.mPais);

        return convertView;
    }
}

【问题讨论】:

  • 您面临的问题是什么?

标签: android android-arrayadapter android-adapter parcelable custom-adapter


【解决方案1】:

ListActivity 中,您将从MainActivity 接收到的数据存储在实例变量mUsuariosArray 中,但在创建适配器时您没有使用mUsuariosArray。相反,您使用的是空数组列表。

ArrayAdapter adapter = new ArrayAdapter(this, usuariosArrayList);

您的代码应如下所示:

ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, mUsuariosArray);

【讨论】:

  • 感谢 Wand Maker,但我试过了,但效果不佳。我对 loadDadosDeUsuario 方法做了一些更改,因为我认为它返回了一个空数组。但即使在此之后,它仍然给我错误。我怀疑应用程序在加载意图时在 loadButtonActions 方法中被杀死。我在那里运行了调试,并且有一个地方说“parcellable data = null”。如果与它有关,请不要打结。我将再次发布更新的代码和下面的错误日志猫。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2014-09-25
  • 2016-01-30
相关资源
最近更新 更多