6

私は現在、要求が 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;
    }
}
4

2 に答える 2

3

私の懸念によると、onClick をgetView()カスタム アダプターに割り当てるのではなく、元のアクティビティの ListView に割り当てることをお勧めします。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     
  }   
 });  
于 2012-04-23T06:46:45.137 に答える
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

    }
于 2012-04-23T06:51:38.710 に答える