我如何使用此监听器

时间:2016-01-31 03:44:22

标签: java android arrays database list

我一直试图解决这个愚蠢的问题9个小时了,我快要哭了。

我有一个列表视图,我只想检测是否有人长按了一个项目。如果是这样,我想删除该项目。所以,我使用了以下代码:

 listview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

        @Override
        public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                                       int pos, long id) {

            Log.v(TAG, "LONG CLICKED");


            Toast.makeText(MainActivity.this, "Long click", Toast.LENGTH_SHORT).show();

            contactArrayList.remove(pos);
            arrayAdapter.notifyDataSetChanged();


            return true;
        }

//PLEASE HELP ME I AM GOING TO CRY WHY ISNT THIS WORKING
    });

现在,第一次调用此方法,但在执行旋转屏幕之后,长按方法 JUST DOESNT GET DETECTED 。如果我在列表中添加了另一个项目,那么再次开始检测

所以,这是我添加项目(这是联系人姓名和号码)时执行的代码:

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == PICK_CONTACT && resultCode == RESULT_OK) {
            contactUri = data.getData();
            cursor = getContentResolver().query(contactUri, null, null, null, null);
            cursor.moveToFirst(); //Move to first row...IDK why
            int NumberColumn = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); //Int column is the column of the numbers

            String contactNumber = cursor.getString(NumberColumn);
            String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

            if(contactArrayList.size() <= 4) {

                contactArrayList.add(contactName + " - " + contactNumber);
                arrayAdapter.notifyDataSetChanged();

这是我的onCreate,虽然看起来没必要:

public class MainActivity extends AppCompatActivity {

ArrayList<String> contactArrayList;
ArrayAdapter <String> arrayAdapter;
ListView listview;
public static final int PICK_CONTACT = 100; //Request code to make sure it is same in onActivityResult and in startActivityForResult inent
SharedPreferences contacts;
SharedPreferences.Editor contactEditor;
private static final String TAG = "MainActivity";
Uri contactUri;
Cursor cursor;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    contacts = this.getSharedPreferences("contacts", MainActivity.MODE_PRIVATE); //Making a shared preferences


    contactArrayList= new ArrayList<String>();
    listview = (ListView) findViewById(R.id.listView);

    arrayAdapter = new ArrayAdapter (this, android.R.layout.simple_list_item_1, contactArrayList);
    listview.setAdapter(arrayAdapter);

    arrayAdapter.notifyDataSetChanged();


    loadSavedStuff();

    for (String s : contactArrayList){
        Log.d(TAG, "Array List : "+ s);
    }

}

public void loadSavedStuff() {
    //CLEAR CONTENTS OF ARRAYLIST AND GET THEM FROM SHARED PREFERENCE OF CONTACTS SAVED IN ONPAUSE


    if(contacts != null && (contacts.getStringSet("contactSetKey", null) != null)) { //If the shared preferences and the stuff inside
        contactArrayList.clear();
        contactArrayList.addAll(contacts.getStringSet("contactSetKey", null));
        arrayAdapter.notifyDataSetChanged();
    }


    for (String s : contactArrayList){
        Log.d(TAG, "Array List : "+ s);
    }


}

请帮我解决这个问题。我已花了9个小时在这上面,我真的需要知道为什么它正在发生以及如何解决它。这很奇怪,因为在添加一个项目之后,再次检测到长按...

非常感谢,

Ruchir

4 个答案:

答案 0 :(得分:1)

根据评论部分的讨论。我们发现侦听器设置在onActivityResult中,导致问题如前所述。

  

长按法只是没有检测到。如果我将另一个项目添加到列表中,则会再次开始检测。

侦听器设置在onActivityResult中,只有在您从选择联系人回来时才会触发。这就是为什么你只能在添加新联系人时长按。

在引用ListView之后将设置侦听器的代码部分移动到onCreate将解决您的问题。

要详细了解活动生命周期和onActivityResult,您可以参考Activity Life CycleGetting a result from an Activity

答案 1 :(得分:0)

您可以尝试:

mysql -u user -p<password here>

答案 2 :(得分:0)

Android会破坏所有内容,并在配置更改时进行重建。您的侦听器可能正在引用从其调用的任何旧实例。您需要附加/分离监听器。你使用匿名听众的事实也没有帮助。

答案 3 :(得分:0)

我通过以下方式收听Click和LongClick项目,而不将配置添加到清单作为上一个答案,在您的RecyclerView持有者中,使其实现实现View.OnLongClickListener,然后在您的RecycleViewHolder Const中,添加以下内容:

convertNumb

现在覆盖方法:

itemView.setOnLongClickListener(this);

您可以通过getLayoutPosition获取项目位置,然后将其删除。