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」。如果與它有任何關係,不要打結。我會再次發佈更新的代碼,下面是錯誤日誌貓。 –