0

単純なAndroidRESTクライアントを実装しようとしていますが、アクティビティ間でデータを渡す方法を理解するのに問題があります。

私はこのListActivityを持っています(私はSpringRESTテンプレートを使用しています):

    public class MainActivity extends ListActivity
{
    protected static final String TAG = MainActivity.class.getSimpleName();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        Toast.makeText(this, "You have selected" + position + id ,
                Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onStart() {

        super.onStart();
        new DownloadClientesTask().execute();
    }

    private void refreshClientes(List<Cliente> clientes) {
        if (clientes == null) {
            return;
        }

        ClientesListAdapter adapter = new ClientesListAdapter(this, clientes);
        setListAdapter(adapter);
    }

    private class DownloadClientesTask extends AsyncTask<Void, Void, List<Cliente>> {

        @Override
        protected List<Cliente> doInBackground(Void... params) {
            final String url = "http://192.168.1.119/~henry/api_slim/index.php/customers";

            try {
                // Set the Accept header for "application/json"
                HttpHeaders requestHeaders = new HttpHeaders();
                List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
                acceptableMediaTypes.add(MediaType.APPLICATION_JSON);
                requestHeaders.setAccept(acceptableMediaTypes);

                // Populate the headers in an HttpEntity object to use for the request
                HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders);

                // Create a new RestTemplate instance
                RestTemplate restTemplate = new RestTemplate();
                restTemplate.getMessageConverters().add(new MappingJacksonHttpMessageConverter());

                // Perform the HTTP GET request
                ResponseEntity<Cliente[]> responseEntity = restTemplate.exchange(url, HttpMethod.GET, requestEntity,
                        Cliente[].class);

                // convert the array to a list and return it
                return Arrays.asList(responseEntity.getBody());
            } catch (Exception e) {
                // TODO Auto-generated catch block
                Log.e(TAG, e.getMessage(), e);
            }

            return null;

        }

        @Override
        protected void onPostExecute(List<Cliente> result) {

            refreshClientes(result);
        }

    } 

}

そしてこれは私のlistAdapterです:

public class ClientesListAdapter extends BaseAdapter{

    private List<Cliente> clientes;
    private final LayoutInflater layoutInflater;

    public ClientesListAdapter(Context context, List<Cliente> clientes) {
        this.clientes = clientes;
        this.layoutInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return this.clientes != null ? clientes.size() : 0;
    }

    @Override
    public Cliente getItem(int position) {
        return this.clientes.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = this.layoutInflater.inflate(R.layout.cliente_list_item, parent, false);
        }

        Cliente cliente = getItem(position);
        if (cliente != null) {
            TextView t = (TextView) convertView.findViewById(R.id.name);
            t.setText(cliente.getFirstname());
        }

        return convertView;
    }

}

これは、取得するデータのPOJOクラスです。

public class Cliente {
    private Integer id_customer; 
        private String firstname;
        public Integer getId_customer() {
        return id_customer;
    }
    public void setId_customer(Integer id_customer) {
        this.id_customer = id_customer;
    }
        public String getFirstname() {
        return firstname;
    }
    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }
}

listViewから要素を選択すると、別のアクティビティまたはフラグメントでこの要素に固有の詳細を表示したいのですが、リストからこの要素のcustomer_idを取得する方法がわかりません。処理するときに、この要素を保存する必要がありますか?応答?この動作を提供するコンテンツプロバイダーまたはデータベースを使用する必要がありますか?私は本当に混乱しています、助けてくれてありがとう!

4

3 に答える 3

0

リストはアダプターにあります:

private List<Cliente> clientes;

onListItemClickでは、positionパラメーターを使用してこのリストからClienteを取得できます。

startActivityを呼び出すときに情報を別のアクティビティに渡し、インテントを渡します。インテントには追加情報が含まれている場合があります。この場合、customer_idをintextraとして次のように設定できます。

intent.putExtra(EXTRA_CUSTOMER_ID, customer_id);
于 2012-11-22T16:17:03.903 に答える
0

クリックされたアイテムの位置を取得し、その位置に存在するオブジェクトを配列リストから取得し、それを使用して必要な詳細を取得します。

使用する

@Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        Toast.makeText(this, "You have selected" + position + id ,
                Toast.LENGTH_SHORT).show();
      // use  this.clientes.get(position) and pass it to the next activity or fragment  using putextras to where you need to pass and display this in the destination end using the same object by getting it using getExtra()

    }
于 2012-11-22T16:15:31.113 に答える
0

ここには、あるアクティビティから別のアクティビティにデータを渡す方法、アクティビティ間でオブジェクトを渡す方法の良い例があります。これらのリンクの解決策を最初に確認することをお勧めします。

あなたを正しい軌道に乗せることができる例を以下に見てください。

リストアダプタクラス:

public class ClientesListAdapter extends BaseAdapter{

    //private members
    private List<Cliente> clientes;

    //adapter position - not used for this example
    public int adapterPosition;

    //context of app
    private Context mContext;

    //default constructor
    public ClientesListAdapter(Context context, List<Cliente> clientes) {

        //context pointer
        this.mContext = context;

        //alloc
        this.clientes = new ArrayList<Cliente>(clientes.size());
        this.clientes.addAll(clients);
    }

    //Holder for events and dates (memory management)
    public static class ViewHolder{
        TextView myTextView;//this is actually findViewById(R.id.name) @see getView() method
    }

    //generated method
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return this.clientes != null ? clientes.size() : 0;
    }

    //generated method
    @Override
    public Cliente getItem(int position) {
        return this.clientes.get(position);
    }

    //generated method
    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    //get client's id
    public int getClienteId(int position){
        return this.clientes.get(position).getClienteId();
    }

    //get client's id without passing the position
    public int getClienteId(){
        return this.clientes.get(adapterPosition).getClienteId();
    }

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

        //row is actually convertView (the current view)
        View row = convertView;
        //holds our view elements
        ViewHolder holder;

        //if row is null 
        if(row == null){
            //inflate layout to get our view elements
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(com.yourapp.R.layout.my_layout, parent, false);//your layout here, modify code
            //set up the holder
            holder = new ViewHolder();
            holder.myTextView = (TextView) row.findViewById(com.yourapp.R.id.name);

            //give the row a tag (holder)
            row.setTag(holder);

        }else{
            //row is not null we can see it (no need to allocate memory)
            holder = (ViewHolder) row.getTag();
        }

        //get your cliente object
        Cliente cliente = this.clientes.get(position);
        if (cliente != null) {
            holder.myTextView.setText(cliente.getFirstname());
        }

        //copy position
        adapterPostion = position;

        return convertView;
    }

}

メモリ管理にViewHolderクラスを使用したことがわかります。これは、リストアダプタ内にビュー要素を保持するための良い方法です。Romain Guy-The World of ListViewsによって説明されている、リストビューに関する詳細情報を見つけることができます 。

MainActivityからアダプターを割り当て、クリックしてアイテムを取得します。

//---- code --- //
ListView myListView = (ListView)findViewById(R.id.mylistview);//or you may use ListActivity
ClientesListAdapter adapter = new ClientesListAdapter(this, clientes);//"this" or "getApplicationContext()"
myListView.setAdapter(adapter);
adapter.notifyDataSetChanged();//notify
// ---- code --- //
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    Toast.makeText(this, "You have selected" + position + id ,
            Toast.LENGTH_SHORT).show();

    Intent intent = new Intent(MyActivity.this, ActivityB.class);
    intent.putInt("cliente_id",adapter.getClienteId());
    startActivity(intent);
}

もう1つの例は、次のようなアダプタにインターフェイスを実装する場合です。

//--code//
//Interface method
private OnSaveEditsListener saveEditsListener = null;
public void setOnSaveEditsListener(OnSaveEditsListener l) {
    saveEditsListener = l;
}
//--code//

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

        //--code--//

        //get clicked position of calendar (get clicked day)
        convertView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                v.requestFocusFromTouch();
                currentAgendaPosition = position;
                try{
                    saveEditsListener.onSaveEdits();
                }catch(Exception ex){
                    ex.printStackTrace();
                }
            }
        });

        //returns current row
        return row;
    }
    //--code--//

そして、MainActivityから次のような2番目のアクティビティを開始します。

adapter.setOnSaveEditsListener(new OnSaveEditsListener() {

    @Override
    public void onSaveEdits() {
        //Start activity from here
        //--code--//
        startActivity(intent);
    }
});
于 2012-11-23T09:32:45.200 に答える