2011-10-11 82 views
3

我对Android开发相当新,我试图构建一个ListView,它使用gson从Web服务获取数据。我有一个模型类,一个列表类,一个适配器类和活动类。OnItemClickListener从模型获取数据

该列表正常工作,它获得了数据,现在我想将OnItemClickListener集成到它并将数据传递给第二个活动。我希望获得项目id(DistrictId)并将其传递给下一个Activity(listView),而不是行ID。如果有人能让我看到灯光,那将是非常棒的......因为文档不够清晰,而且因为我是新手。

以下是我的代码。

模型类

package com.sample.myapp; 

public class DistrictModel { 
private String id; 
private String districtName; 

public String getDistrictId() { 
    return id; 
} 
public void setId(String id) { 
    this.id = id; 
} 
public String getDistrictName(){ 
    return districtName; 
} 
public void setDistrictEN(String districtName){ 
    this.districtName = districtName; 
} 
} 

List类

public class DistrictList { 
private List<DistrictModel> districts; 

public List<DistrictModel> getDistricts(){ 
    return districts; 
} 
public void setDistrictList(List<DistrictModel> districts){ 
    this.districts = districts; 
} 
} 

适配器类

public class DistrictAdapter extends ArrayAdapter<DistrictModel>{ 
int resource; 
String response; 
Context context; 
private LayoutInflater dInflater; 

public DistrictAdapter(Context context, int resource, List<DistrictModel> objects) { 
     super(context, resource, objects); 
     this.resource = resource; 
     dInflater = LayoutInflater.from(context); 
} 

static class ViewHolder { 
    TextView title; 
} 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    ViewHolder holder; 
    //Get the current location object 
    DistrictModel lm = (DistrictModel) getItem(position); 

    //Inflate the view 
    if(convertView==null) 
    { 
     convertView = dInflater.inflate(R.layout.item_district, null); 
     holder = new ViewHolder(); 
     holder.title = (TextView) convertView 
       .findViewById(R.id.district_name); 

     convertView.setTag(holder); 
    } 
    else 
    { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.title.setText(lm.getDistrictName()); 

    return convertView; 
} 
} 

活动类

public class DistrictListActivity extends Activity{ 
LocationManager lm; 

ArrayList<DistrictModel> districtArray = null; 
DistrictAdapter districtAdapter; 
DistrictList list; 

ListView lv; 

public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.districtlist_layout); 

    lv = (ListView) findViewById(R.id.list_district); 

    districtArray = new ArrayList<DistrictModel>(); 
    districtAdapter = new DistrictAdapter(DistrictListActivity.this, R.layout.item_district, districtArray); 

    lv.setTextFilterEnabled(true); 
      lv.setAdapter(districtAdapter); 

      try { 
       new DistrictSync().execute("http://aws.something.com/service"); 
      } catch(Exception e) {} 

    lv.setOnItemClickListener(new OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View convertView, int position, long id) { 
       AlertDialog.Builder adb=new AlertDialog.Builder(DistrictListActivity.this); 
       adb.setTitle("LVSelectedItemExample"); 
       adb.setMessage("Selected Item is = "+(lv.getItemIdAtPosition(position))); 
       adb.setPositiveButton("Ok", null); 
       adb.show(); 

       } 
     }); **//i'd like to get the DistrictId from the json data.** 
} 



private class DistrictSync extends AsyncTask<String, Integer, DistrictList> { 

    protected DistrictList doInBackground(String... urls) { 
     DistrictList list = null; 
     int count = urls.length; 

     for (int i = 0; i < count; i++) { 
      try {   
       // ntar diganti service 
       RestClient client = new RestClient(urls[i]); 

       try { 
        client.Execute(RequestMethod.GET); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

       String json = client.getResponse(); 

       list = new Gson().fromJson(json, DistrictList.class); 

       // 
      } catch(Exception e) {} 
     } 
     return list; 
    } 

    protected void onProgressUpdate(Integer... progress) { 

    } 

    protected void onPostExecute(DistrictList dislist) { 

     for(DistrictModel lm : dislist.getDistricts()) 
     { 
      districtArray.add(lm); 
     } 
     districtAdapter.notifyDataSetChanged(); 
    } 

} 
} 

出于测试目的,现在我点击了排它会告诉我行ID,所以我知道的onclick监听器的工作原理,但我只是想它抓住了我的DistrictId这样我就可以用它来传递下一个活动。

非常感谢。

回答

9

(从我的头)试试这个:

((DistrictModel)lv.getAdapter().getItem(position)).getDistrictId(); 
+0

完美,谢谢! –

+1

但是,如何将这个意图传递给另一个活动? –

1

通常,当您想要将数据从一个Activity传递到另一个时,只需将其放入您用来创建新ActivityIntent即可。

例如(和here are some additional examples):

Intent i = new Intent(context, MyNewActivity.class); 
i.putExtra("MyCurrentHealth", mCurrentHealth); 
context.startActivity(i); 

检索数据做到这一点:

Bundle extras = getIntent().getExtras(); 
if (extra != null) { 
    ... // Do stuff with extras 
} 
+0

你的答案是非常有用,谢谢......自从我在解决第一部分之前解决了这个问题之后,我就选择了Peter给出的答案。但非常感谢。 –