Почему один щелчок по элементу списка запускает CAB?

Я новичок в разработке приложений для Android, и теперь я застрял в вопросе. Мое приложение использует SimpleAdapter в качестве адаптера для заполнения представления списка, я реализовал интерфейс AdapterView.OnItemClickListener и зарегистрировал его в представлении списка, а также реализовал интерфейс AbsListView.MultiChoiceModeListener для обработки события длинного щелчка. Но когда я один раз щелкну элемент в представлении списка, будет запущен метод onItemClicked() и будет показан CAB, почему?

Ниже мой код:

package com.XXX.listviewdemo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

    private Button like = null;
    private ListView list = null;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        List<Map<String,String>> data = new ArrayList<Map<String,String>>();
        String ITEM1 = "Name", ITEM2 = "Age", ITEM3 = "Gender", ITEM4 = "Country";
        String[] names = {"Jim","Tim","Tom","Jack","James","Jason","Anna","Lucy","Lily","Venus"};
        String[] ages = {"21","22","23","23","21","37","34","26","28","29"};
        String[] genders = {"Male","Male","Male","Male","Male","Male","Female","Female","Female","Female"};
        String[] countries = {"UK","US","US","CN","AU","CA","CA","CA","US","UK"};
        for(int i=0;i<10;i++){
            Map<String,String> mapItem = new HashMap<String,String>();
            mapItem.put(ITEM1, names[i]);
            mapItem.put(ITEM2, ages[i]);
            mapItem.put(ITEM3, genders[i]);
            mapItem.put(ITEM4, countries[i]);
            data.add(mapItem);
        }
        list = (ListView)findViewById(R.id.listView);
        list.setClickable(true);
        list.setAdapter(new SimpleAdapter(MainActivity.this,data,R.layout.list,
                new String[]{ITEM1,ITEM2,ITEM3,ITEM4},new int[]{R.id.listName,R.id.listAge,R.id.listGender,R.id.listCountry}));
        list.setOnItemClickListener(new listItemClickListener());
        list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
        list.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener(){
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                switch(item.getItemId()){
                case R.id.menu_delete:
                    System.out.println("trying to remove a list view item");
                    mode.finish();
                    return true;
                default:
                    return false;
                }
            }

            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                MenuInflater inflater = mode.getMenuInflater();
                inflater.inflate(R.menu.activity_main, menu);
                return true;
            }

            public void onDestroyActionMode(ActionMode arg0) {}
            public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {return false;}
            public void onItemCheckedStateChanged(ActionMode arg0, int arg1,long arg2, boolean arg3) {}
        });
        list.setOnHoverListener(new View.OnHoverListener() {
            public boolean onHover(View arg0, MotionEvent arg1) {
                arg0.setBackgroundColor(Color.CYAN);
                return false;
            }
        });
    }

    class listItemClickListener implements OnItemClickListener{
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            System.out.println("The adapter view ID is====> "+arg0.getId());
            System.out.println("The clicked item ID is====> "+arg1.getId());;
            System.out.println("The clicked item Pos is====> "+arg2);
            System.out.println("The clicked Row is====> "+arg3);
            ((ListView)arg0).setItemChecked(arg2, true);
            Toast.makeText(MainActivity.this, "You selected "+((TextView)arg1.findViewById(R.id.listName)).getText(), Toast.LENGTH_SHORT).show();
        }
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

Кроме того, я хочу знать, как удалить строку списка в методе onActionItemClicked(), когда пользователь выполняет длинный щелчок и выбирает меню delete в CAB.


person YuC    schedule 01.03.2013    source источник


Ответы (1)


  @Override
 protected void onListItemClick(ListView l, View v, int position, long id) {
if (adapter.getItem(position).getResult() != null) 
{
    Intent intent = new Intent(HistoryActivity.this, CaptureActivity.class);
    intent.putExtra(Intents.History.ITEM_NUMBER, position);
    setResult(Activity.RESULT_OK, intent);
    Toast.makeText(getApplicationContext(), "Long press on item to get Contextmenu", Toast.LENGTH_LONG).show();
  //finish();
}

Привет, пожалуйста, проверьте свой onListItemClick и используйте адаптер, чтобы получить позицию элемента и реализовать событие длинного клика ниже кода

     listView.setOnItemLongClickListener (new OnItemLongClickListener() {
   public boolean onItemLongClick(AdapterView parent, View view, int position, long id)         
   {

   //do your stuff here
   }
   });
person androidgeek    schedule 01.03.2013
comment
Ответы только на код не приветствуются. Объясните свой код и какие проблемы вы обнаружили... - person WarrenFaith; 01.03.2013
comment
привет, @androidgeek, не могли бы вы указать, что не так с моим методом onItemClicked()? И после того, как я удалю ((ListView)arg0).setItemChecked(arg2, true); в методе onItemClick(), один щелчок по элементу представления списка не вызовет CAB для показа(). Кроме того, я реализовал метод onItemLongClick(), при долгом нажатии на элемент представления списка он не попадет в него, а просто отобразит CAB. - person YuC; 02.03.2013