1

我想用ListViewArrayAdapterParcelable构建一个简单的例子。如何将ArrayAdapter与Parcelables结合使用?

在我的示例中,有第1个Activity,其中用户键入他的姓名,地址和国家。然后将这些数据分组并发送到第二个Activity。 (我知道我不需要包裹发送数据,但我真的想练一个非常简单的例子parceling的这一数额)

二号Activity的数据呈现在使用的ArrayAdapter一个List

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

下面是代码:

主要活动:

 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(); 
    } 
} 

LIST活动:

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; 
    } 
} 
+0

什么是你所面临的问题? –

回答

1

ListActivity,您存储数据从MainActivity在实例变量mUsuariosArray接受,但你不使用mUsuariosArray在创建适配器。相反,您正在使用一个空的数组列表。

ArrayAdapter adapter = new ArrayAdapter(this, usuariosArrayList); 

你的代码应该是象下面这样:

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

感谢魔杖制造商,但我试过这个,它并没有工作。我在loadDadosDeUsuario方法上做了一些改变,我想它是返回一个空数组。但即使如此,它仍然给我错误。我怀疑该应用程序在加载意图时在loadButtonActions方法中被杀死。我在那里运行了调试,并且在那里提到“parcellable data = null”。如果与它有任何关系,不要打结。我会再次发布更新的代码,下面是错误日志猫。 –