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