2012-04-23 23 views
5

Tôi hiện đang xây dựng một ứng dụng có yêu cầu được gửi vào web, kết quả sau đó được phân tích cú pháp và đưa vào một ArrayList đối tượng.truy cập các đối tượng tùy chỉnh trong danh sách xem

danh sách này sau đó, điền một ListView. Tôi muốn tạo một onClickListener để cho phép tôi biết đối tượng nào được nhấp vào, nhưng tôi không thể tìm được cách chính xác để thực hiện điều này.

hoặc chỉ định onClick cho ListView trong hoạt động ban đầu hoặc chỉ định người nghe trong hàm getView trong bộ điều hợp tùy chỉnh.

có vẻ như với tôi như chỉ định người nghe trong số getView có quá nhiều chi phí.

cách hoạt động? những gì là tốt hơn?

mã cho hoạt động chính:

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 
} 

mã cho danh sách adapter:

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

Trả lời

3

Theo mối quan tâm của tôi, giao onClick vào ListView trong hoạt động ban đầu là ý tưởng hay, thay vì sau đó gán nó vào trong getView() của bộ điều hợp tùy chỉnh của bạn. Bởi vì trong getView() của adapter của bạn nó luôn luôn tạo ra một View.onClick mới() 's đối tượng ..

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'? để làm gì? –

+0

@PareshMayani - Oh xin lỗi, sai lầm của tôi là onItemClickListener .. Cảm ơn vì điều đó. – user370305

+0

Tôi nghĩ rằng 'onClickListener' không thể nhận được một' onItemSelectedListener'. vì nó phải là một 'onItemSelectedListener' – thepoosh

3

Đồng ý với user370305 câu trả lời của.

Bạn chỉ cần triển khai OnItemClickListener trong lớp Hoạt động của mình, sau khi tạo, bạn sẽ nhận được phương thức onItemClick, bên trong đó bạn sẽ nhận được vị trí của đối tượng được nhấp.

@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 (vị trí); ** sẽ trả về biến vị trí của anh ta. nhìn vào mã adapter của mình .. và nó sẽ ném ngoại lệ lớp học diễn viên .. – ngesh

+0

@ sandy có nó là, tôi chỉ cho anh ta một cách để thực hiện sự kiện OnItemClick, cho phần còn lại anh nên thử bằng tay của họ. –

+0

@sandy, 'getItem (vị trí)' sẽ được triển khai ngay bây giờ, tôi chưa triển khai nó ... – thepoosh

Các vấn đề liên quan