我一直试图解决这个愚蠢的问题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
答案 0 :(得分:1)
根据评论部分的讨论。我们发现侦听器设置在onActivityResult中,导致问题如前所述。
长按法只是没有检测到。如果我将另一个项目添加到列表中,则会再次开始检测。
侦听器设置在onActivityResult中,只有在您从选择联系人回来时才会触发。这就是为什么你只能在添加新联系人时长按。
在引用ListView之后将设置侦听器的代码部分移动到onCreate将解决您的问题。
要详细了解活动生命周期和onActivityResult,您可以参考Activity Life Cycle和Getting 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获取项目位置,然后将其删除。