【问题标题】:How do I use this listener我如何使用这个监听器
【发布时间】:2016-05-08 16:44:57
【问题描述】:

我已经尝试解决这个愚蠢的问题 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
    });

现在,第一次调用此方法,但在执行旋转屏幕之类的操作后,长按方法不会被检测到。但是,如果我将另一个项目添加到列表中,那么它再次开始被检测到

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

   @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 个小时,我真的需要知道 为什么 它会发生以及如何解决它。这很奇怪,因为在添加项目后,再次检测到长按...

非常感谢,非常感谢,

鲁基尔

【问题讨论】:

  • 这很奇怪,因为在添加项目后,再次检测到长按...我将不胜感激任何人。一个评论,一个答案,任何帮助!
  • 是的,我也想知道你在哪里设置你的监听器
  • @Styx Like this: 'listview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {' 我该怎么做?可能是什么问题?非常感谢您帮助我!
  • 是的@MikeM。是对的。不是如何设置它们,而是在哪里设置它们。在 OnCreate? OnResume?
  • @MikeM。在 onActivityResult 方法中

标签: java android arrays database list


【解决方案1】:

根据评论部分的讨论。我们发现在 onActivityResult 中设置了侦听器,这会导致您前面描述的问题。

长按方法不会被检测到。但是,如果我将另一个项目添加到列表中,则它会再次开始被检测到。

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

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

要了解有关活动生命周期和 onActivityResult 的更多信息,您可以参考 Activity Life CycleGetting a result from an Activity

【讨论】:

  • @RuchirBaronia 附加监听器就像告诉视图在触发事件时要做什么。您只需附加一次,它将持续到活动完成、侦听器分离或附加新侦听器。
【解决方案2】:

你可以试试:

    <activity android:name=".MainActivity"
              android:configChanges="keyboardHidden|orientation|screenSize">
    </activity>

【讨论】:

    【解决方案3】:

    Android 会销毁所有内容并在配置更改时重新构建。您的侦听器可能正在引用它被调用的任何旧实例。您将需要附加/分离侦听器。您使用匿名侦听器这一事实也无济于事。

    【讨论】:

    • 再次运行相同的代码并重新附加新的侦听器。匿名监听器没有错。
    • 当你说再次运行时?在什么条件下再次运行?
    • 那么没有匿名类怎么办呢?你能举例说明如何解决它吗?非常感谢,我已经卡了 10 个小时了
    • 屏幕旋转时重新创建活动意味着重新运行onCreate中的代码并再次将新的侦听器重新附加到ListView。如果我错了,请纠正我。
    • @RuchirBaronia 请告诉我们你把你的听众附在哪里?
    【解决方案4】:

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

    itemView.setOnLongClickListener(this);
    

    现在重写方法:

        @Override
    public boolean onLongClick(View view) {
        Log.i(YourTAG,getLayoutPosition());
    
        return true;
    }
    

    你可以通过getLayoutPosition获取item位置,然后移除它。

    【讨论】:

    • 他面临的问题与普通的 ListView 实现有关,而不是 recyclerView
    • 为什么不升级到 RecyclerView ?比较好,帮手也不少。
    • 这就像一个人问你如何修自行车,你却要求他买辆车。
    • 这辆车更好,更安全:p。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2016-07-20
    相关资源
    最近更新 更多