Как я могу щелкнуть каждый элемент по отдельности при использовании BaseAdapter в ListView?

У меня проблема с нажатием на элемент в кастоме ListView который содержит ToggleButton, Button, TextView а также Spinner в каждом ряду. Вопрос: как я могу сделать это, когда я нажимаю на каждое представление индивидуально, для каждого представления вызываются разные действия? Мой код:

public class CustomListAdapter extends BaseAdapter {

             Context _context;
             private ArrayList<String> _list;  

             public CustomListAdapter(Context context, 
                                         ArrayList<String> listItems) {
              _context= context;
              _list = listItems; 
             }

             public int getCount(){
              return _list.size();
             }

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

             public Object getItem(int position){
              return _list.get(position);
             } 



             public View getView(int position,View convertView,ViewGroup parent)
             {
               ViewContainer container = new ViewContainer();       

               if(convertView == null)
               {  
                   LayoutInflater inflater = LayoutInflater.from(_context);
                   convertView = inflater.inflate(R.layout.elements,parent, false);
                   convertView.setTag(container); 
                   convertView.setClickable(true);

                   container.listIcon = (ToggleButton)convertView.findViewById(R.id.togle_item);
                   container.listText = (TextView)convertView.findViewById(R.id.text_listitem);
                   container.spinner=(Spinner)convertView.findViewById(R.id.spinner1);
                   container.but=(Button)convertView.findViewById(R.id.button1);
                  convertView.setOnClickListener(new OnClickListener() {

                       public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) 
                       {

                         **How can I do that when I click each view individually, different action is called for each view???**
                       }

                    public void onClick(View v) {

                    }

                    }
                  );
               }
                 container = (ViewContainer) convertView.getTag();
                 ToggleButton myListIcon = container.listIcon;
                 myListIcon.setChecked(true);
                 Button MyButton=container.but;
                 TextView myListText = container.listText;
                 myListText.setText(_list.get(position));
                 Spinner MySpinner=container.spinner;
                 MySpinner.setAdapter(adapter);
                 container = null;
                 return convertView;
              }
              private class ViewContainer
              {
                  private ToggleButton listIcon; 
                  private TextView listText;
                  private Spinner spinner;
                  private Button but;
              }

        }

4 ответа

Я предполагаю, у вас есть кнопка, текстовое представление и.. на ListView. и вам нужно написать действие для кнопки на просмотр списка.

это формат кодирования:

        .....
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.calllog_row, null);
            button1 = (Button) view.findViewById(R.id.button1);
            button1.setOnClickListener(this);
        }
        else {
            view = convertView;
        }

        Button1 = (Button) view.findViewById(R.id.Button1);
        Button1.setTag(position);   // this is important


        return view;
    }
    public void onClick(View v) {
        Integer position = (Integer) v.getTag();
        switch (v.getId()) {
        case R.id.button1:
            Log.e("click position ", "" + position);
            break;

    }

 ......

если мое предположение верно, моя кодировка будет вам полезна.

vh.orderButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            // ---Starting new intent
            Intent in = new Intent(activity.getApplicationContext(), ActivityOrder.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ;
            // ---sending product no to next activity
            in.putExtra("product_category", productNo);
            in.putExtra("business_id", businessId); 
            // ---starting new activity and expecting some response back
            activity.getApplicationContext().startActivity(in);

            Toast.makeText(activity, productNo + " " + businessId, Toast.LENGTH_SHORT).show();
        }
    });

Вместо добавления OnClickListener к convertView добавить слушателей для каждого View из строки, для которой вам нужно выполнить разные действия:

//...
container.listIcon.setOnClickListener(new OnClickListener() {

   public void onClick(View v) {
      //action for the toggle Button
   }
});
container.but.setOnClickListener(new OnClickListener() {

   public void onClick(View v) {
      //action for the simple Button
   }
});
container.spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
     public void onItemSelected(AdapterView<?> parent,
        View view, int pos, long id) {
       //something was selected on the spinner
    }

    public void onNothingSelected(AdapterView parent) {
      // for interface
    }
});
//...

Вам нужно изменить ваш getView, как я покажу ниже код.

@Override
        public View getView(int position, View convertView, ViewGroup arg2) {
            ViewContainer container;

            if(convertView == null)
               {  
                   LayoutInflater inflater = LayoutInflater.from(_context);
                   convertView = inflater.inflate(R.layout.elements,parent, false);
                   container = new ViewContainer(); 
                   //convertView.setClickable(true);
                   container.listIcon = (ToggleButton)convertView.findViewById(R.id.togle_item);
                   container.listText = (TextView)convertView.findViewById(R.id.text_listitem);
                   container.spinner=(Spinner)convertView.findViewById(R.id.spinner1);
                   container.but=(Button)convertView.findViewById(R.id.button1);
                   convertView.setTag(container); 
               }else{
                   container=convertView.getTag();
               }
            //Now for set Click event for your Induavidual item in list you can do like below
            //use postion to set id of each item
            container.but.setId(position);
            container.but.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                              //This will give you position of item 
                             int id=v.getId();

                }
            });

        //same you can do for spinner and textview and ToggleButton ,use appropriate method that you want to use 

            return convertView;
        }
Другие вопросы по тегам