2012-04-23 70 views
5

我目前正在构建一个应用程序,该请求被发送到Web中,结果被解析并放入对象的ArrayList中。在列表视图中访问自定义对象

然后填充ListView。 我想创建一个onClickListener,它可以让我知道哪个对象被点击了,但我找不到实现这个的正确方法。

要么将​​onClick分配给原始活动中的ListView,要么在自定义适配器中的getView函数中分配侦听器。

在我看来,分配getView中的听众有太多开销。

它是如何工作的?什么是更好的?对于主要活动

代码:

public class NoPicList extends Activity { 
    ListView list; 
    NoPicAdapter adapter; 
    ProgressDialog mDialog; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.no_pic_list); 
     list = (ListView) findViewById(R.id.noPicListView); 

     Bundle b = getIntent().getExtras(); 
     String request = b.getString("REQUEST"); 
     mDialog = new ProgressDialog(this); 
     mDialog.setCancelable(false); 
     mDialog.setMessage("Lodaing Data"); 
     mDialog.show(); 

     new GetNewsAndCalendar().execute(request); 
    } 

    @Override 
    protected void onPause() { 
     mDialog.dismiss(); 
     super.onPause(); 
    } 

    class GetNewsAndCalendar extends 
     AsyncTask<String, Void, ArrayList<Message>> { 

     @Override 
     protected ArrayList<Message> doInBackground(String... params) { 
      String url = params[0]; 
      DOMFeedParser parser = new DOMFeedParser(url); 
      return parser.parse(); 
     } 

     @Override 
     protected void onPostExecute(ArrayList<Message> result) { 
      adapter = new NoPicAdapter(NoPicList.this, result); 
      list.setAdapter(adapter); 
      //FIRST OPTION TO INSERT onClickListener 
      mDialog.dismiss(); 
     } 
    } //end of GetNewsAndCalendar 
} 

的名单适配器代码:

public class NoPicAdapter extends BaseAdapter { 

    private ArrayList<Message> data; 
    private Activity mActivity; 
    private LayoutInflater inflater = null; 

    public NoPicAdapter(Activity a, ArrayList<Message> result) { 
     mActivity = a; 
     data = result; 
     inflater = (LayoutInflater) mActivity 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 
     return data.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View vi = convertView; 
     if (convertView == null) 
      vi = LayoutInflater.from(mActivity).inflate(R.layout.no_pic_list_item, 
       null); 

     TextView title = (TextView) vi.findViewById(R.id.noPicTitle); 
     TextView subtitle = (TextView) vi.findViewById(R.id.noPicSubtitle); 

     title.setText(data.get(position).getTitle()); 
     subtitle.setText(data.get(position).getDate()); 
    // SECOND PLACE TO INSERT THE onClickListener 
     return vi; 
    } 
} 

回答

3

按我的关心,分配的onClick到ListView在原有活动是好主意,而不是将它分配到您的自定义适配器的getView()。因为在你的适配器的getView()它总是创建一个新的View.onClick()的对象 ..

list.setOnItemClickListener(new OnItemClickListener() 
{ 
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) 
    { 
    adapter.get(position); 
    // Get data from your adapter, the above code of line give the custom adapter's object of current position of selected list item  
    } 
}); 
+0

'setOnItemSelectedListener'?为了什么? – 2012-04-23 06:52:12

+0

@PareshMayani - 对不起,我的错误是onItemClickListener ..谢谢你。 – user370305 2012-04-23 06:54:10

+0

我认为'onClickListener'不能得到'onItemSelectedListener'。因此它必须是'onItemSelectedListener' – thepoosh 2012-04-23 07:11:13

3

同意user370305的答案。

您只需要在您的Activity类中实现OnItemClickListener,创建后您将获得onItemClick方法,其中您将获得点击对象的位置

@Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) { 
     // TODO Auto-generated method stub 
     MyObject clickedObject = (MyObject) adapter.getItem(position); 
     // MyObject is user-defined class 

    } 
+0

** adapter.getItem(position); **将返回他的位置变量。看看他的适配器代码..它会抛出类演员异常.. – ngesh 2012-04-23 06:55:45

+0

@sandy是的,我只是向他展示了一种实现OnItemClick事件的方式,其余部分他应该尝试用他们的手。 – 2012-04-23 07:03:27

+0

@sandy,'getItem(position)'将会被执行,我还没有实现它... – thepoosh 2012-04-23 07:14:57