Android 从ListView中选择项(Json数据)

Android 从ListView中选择项(Json数据),android,json,rest,listview,listactivity,Android,Json,Rest,Listview,Listactivity,我正在尝试实现一个简单的android REST客户端,在理解如何在我的活动之间传递数据时遇到了一些问题 我有这个ListActivity(我正在使用SpringREST模板): 当我从listView中选择一个元素时,我想在另一个活动或片段上显示该元素的详细信息,但我不知道如何从列表中获取该元素的customer_id,在处理响应时是否必须保存它?我是否需要使用内容提供商或数据库来提供这种行为?我真的很困惑,提前谢谢你的帮助 获取单击项目的位置,并从arraylist获取该位置上的对象,并使用

我正在尝试实现一个简单的android REST客户端,在理解如何在我的活动之间传递数据时遇到了一些问题

我有这个ListActivity(我正在使用SpringREST模板):


当我从listView中选择一个元素时,我想在另一个活动或片段上显示该元素的详细信息,但我不知道如何从列表中获取该元素的customer_id,在处理响应时是否必须保存它?我是否需要使用内容提供商或数据库来提供这种行为?我真的很困惑,提前谢谢你的帮助

获取单击项目的位置,并从arraylist获取该位置上的对象,并使用它获取所需的详细信息

使用


您的列表位于适配器中:

private List<Cliente> clientes;

关于如何将数据从一个活动传递到另一个活动,有很多很好的例子。您可能想先看看这些链接上的解决方案

请看下面的一个例子,它可以让你走上正确的道路

列出适配器类:

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

}
另一个例子是在适配器中实现如下接口:

//--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--//
adapter.setOnSaveEditsListener(new OnSaveEditsListener() {

    @Override
    public void onSaveEdits() {
        //Start activity from here
        //--code--//
        startActivity(intent);
    }
});
从主活动开始第二个活动,如下所示:

//--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--//
adapter.setOnSaveEditsListener(new OnSaveEditsListener() {

    @Override
    public void onSaveEdits() {
        //Start activity from here
        //--code--//
        startActivity(intent);
    }
});

你有没有试过用“putExtra()”来表达你的意图?你可能想看看这里:还有这里:你为什么评论setContentView()?嘿@Houcine没有具体的原因,我在尝试一些东西,但它是这样工作的。同样使用setContentView,但是布局必须有一个带有espefic id的列表android:id/listHi@Radu,我没有尝试过。我会的,谢谢你的链接。谢谢你的回答真的很有用,我可以更清楚地看到我要做什么。再次感谢
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;
    }

}
//---- 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);
}
//--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--//
adapter.setOnSaveEditsListener(new OnSaveEditsListener() {

    @Override
    public void onSaveEdits() {
        //Start activity from here
        //--code--//
        startActivity(intent);
    }
});