【问题标题】:Can't figure out how to add favorites in list view无法弄清楚如何在列表视图中添加收藏夹
【发布时间】:2016-01-13 09:01:13
【问题描述】:

我有一个列表视图,我正在使用swipe list view 库向列表视图添加滑动功能。最初,如果我长按列表项,该列表项将被添加到我的收藏夹中。我想通过滑动菜单项单击来实现添加到收藏夹的过程,而不是长按。但我不确定如何实现它

我的 onitemlongclick 代码

public boolean onItemLongClick(AdapterView<?> arg0, View view, int position, long arg3)
{
    ImageView fvrtebutton = (ImageView) view.findViewById(R.id.favbtn);


    String tag = fvrtebutton.getTag().toString();
    if (tag.equalsIgnoreCase("no")) {
        shrdPreference.addFavorite(InterActivity.this, codelist.get(position));
        Toast.makeText(InterActivity.this, getString(R.string.fav_added),
                       Toast.LENGTH_SHORT).show();

        fvrtebutton.setTag("yes");
        fvrtebutton.setImageResource(R.drawable.favorite);
    } else {
        shrdPreference.removeFavorite(InterActivity.this, codelist.get(position));
        fvrtebutton.setTag("no");
        fvrtebutton.setImageResource(R.drawable.unfavorite);
        Toast.makeText(InterActivity.this,
                       getString(R.string.fav_removed),
                       Toast.LENGTH_SHORT).show();
    }

    Log.v("long clicked", "pos: " + position);


    return false;
}

我的滑动菜单项及其 onclick

SwipeMenuCreator creator = new SwipeMenuCreator() {

            @Override
            public void create(SwipeMenu menu) {
                // create "open" item
                SwipeMenuItem openItem = new SwipeMenuItem(InterActivity.this);
                // set item background
                openItem.setBackground(new ColorDrawable(Color.rgb(0xC9, 0xC9,
                                                                   0xCE)));
                // set item width
                openItem.setWidth(dp2px(90));
                // set item title
                openItem.setTitle("Open");
                // set item title fontsize
                openItem.setTitleSize(18);
                // set item title font color
                openItem.setTitleColor(Color.WHITE);
                // add to menu
                menu.addMenuItem(openItem);

                // create "delete" item
                SwipeMenuItem favoriteItem = new SwipeMenuItem(InterActivity.this);
                // set item background
                favoriteItem.setBackground(new ColorDrawable(Color.rgb(0xF9,
                                                                     0x3F, 0x25)));
                // set item width
                favoriteItem.setWidth(dp2px(90));
                // set a icon
                favoriteItem.setIcon(R.drawable.unfavorite);

                // add to menu
                menu.addMenuItem(favoriteItem);


            }
        };
        // set creator
        listview.setMenuCreator(creator);

        listview.setOnMenuItemClickListener(new SwipeMenuListView.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(int position, SwipeMenu menu, int index) {
                    //ApplicationInfo item = mAppList.get(position);
                    switch (index) {
                        case 0:
                            // open
                            //open(item);
                            break;
                        case 1:
                            // favorite

                if(favoriteItem.getIcon().equals(getResources().getDrawable(R.drawable.unfavorite))){
                    Toast.makeText(InterActivity.this, "yes", Toast.LENGTH_SHORT).show();
                }

                            break;
                    }
                    return false;
                }
            });

无法将 getTag() 应用于滑动菜单项 甚至尝试使用 equals() 比较 drawable 但得到一个空指针异常

我的适配器的getview()

public View getView(final int position, View view, ViewGroup parent)
    {
    final ViewHolder holder;
    if(view == null){
        holder = new ViewHolder();
        view = inflater.inflate(R.layout.beg_list_item,null);
        holder.listHeading = (TextView) view.findViewById(R.id.beg_list_itemTextView);

        holder.listHash = (TextView) view.findViewById(R.id.listview_hashtags);
        holder.alphabetList = (ImageView) view.findViewById(R.id.beg_list_itemImageView);

        holder.favariteImage = (ImageView) view.findViewById(R.id.favbtn);

        view.setTag(holder);

    }else{
        holder = (ViewHolder) view.getTag();
    }
    CodeList codes = (CodeList) getItem(position);
    holder.listHeading.setText(codeList.get(position).getListHeading());
    holder.listHash.setText(codeList.get(position).getListHashText());
    imageLoader.DisplayImage(codeList.get(position).getAlphabetimg(),
                             holder.alphabetList);


    if (checkFavoriteItem(codes)) {
        holder.favariteImage.setImageResource(R.drawable.favorite);
        holder.favariteImage.setTag("yes");
    } else {
        holder.favariteImage.setImageResource(R.drawable.unfavorite);
        holder.favariteImage.setTag("no");
    }                    





    return view;
}

public boolean checkFavoriteItem(CodeList checkCodes) {
    boolean check = false;
    List<CodeList> favorites = shrdprfrnce.getFavorites(context);
    if (favorites != null) {
        for (CodeList codes : favorites) {
            if (codes.equals(checkCodes)) {
                check = true;
                break;
            }
        }
    }
    return check;
}

这是我试过的方法

public boolean onMenuItemClick(int position, SwipeMenu menu, int index) {
                    //ApplicationInfo item = mAppList.get(position);
                    switch (index) {
                        case 0:
                            // open
                            //open(item);
                            break;
                        case 1:
                            // favorite

                CodeList codes = (CodeList) getItem(position);
                ImageView fvrtebutton= (ImageView) findViewById(R.id.favbtn);

                            if (checkFavoriteItem(codes)){
                                shrdPreference.removeFavorite(InterActivity.this, codelist.get(position));
        fvrtebutton.setTag("no");
        favoriteItem.setIcon(R.drawable.unfavorite);
        fvrtebutton.setImageResource(R.drawable.unfavorite);
        Toast.makeText(InterActivity.this,
                       getString(R.string.fav_removed),
                       Toast.LENGTH_SHORT).show();

                            }else{

                                shrdPreference.addFavorite(InterActivity.this, codelist.get(position));
        Toast.makeText(InterActivity.this, getString(R.string.fav_added),
                       Toast.LENGTH_SHORT).show();

        fvrtebutton.setTag("yes");
        fvrtebutton.setImageResource(R.drawable.favorite);
        favoriteItem.setIcon(R.drawable.favorite);
                                }


                            break;
                    }
                    return false;
                }

                private boolean checkFavoriteItem(CodeList checkCodes) {
                    boolean check = false;
                    List<CodeList> favorites = shrdPreference.getFavorites(InterActivity.this);
                    if (favorites != null) {
                        for (CodeList codes : favorites) {
                            if (codes.equals(checkCodes)) {
                                check = true;
                                break;
                            }
                        }
                    }
                    return check;
                }



                private Object getItem(int position)
                {
                    return codelist.get(position);
                }
            });

我的第 230 行是

favoriteItem.setIcon(R.drawable.favorite)

我的日志猫

13 15:46:21.801 4689 4689 E     AndroidRuntime 致命异常:main 01-13 15:46:21.801 4689 4689 E     AndroidRuntime 进程: com.enlightenme.pac,PID:4689 01-13 15:46:21.801 4689 4689 E AndroidRuntime java.lang.NullPointerException:尝试调用虚拟方法'void com.baoyz.swipemenulistview.SwipeMenuItem.setIcon(int)' 为空 对象引用 01-13 15:46:21.801 4689 4689 E    AndroidRuntime 位于 com.enlightenme.pac.InterActivity$RemoteDataTask$100000001.onMenuItemClick(InterActivity.java:230) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime 在 com.baoyz.swipemenulistview.SwipeMenuListView$100000000.onItemClick(SwipeMenuListView.java:78) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime 在 com.baoyz.swipemenulistview.SwipeMenuView.onClick(SwipeMenuView.java:85) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime 在 android.view.View.performClick(View.java:4780) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime                            在 android.view.View$PerformClick.run(View.java:19866) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime                            在 android.os.Handler.handleCallback(Handler.java:739) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime                            在 android.os.Handler.dispatchMessage(Handler.java:95) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime                            在 android.os.Looper.loop(Looper.java:135) 01-13 15:46:21.801 4689 4689 E AndroidRuntime                              在 android.app.ActivityThread.main(ActivityThread.java:5254) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime 在 java.lang.reflect.Method.invoke(Native Method) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime                            在 java.lang.reflect.Method.invoke(Method.java:372) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime                            在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 01-13 15:46:21.796 4689 4689 D     AndroidRuntime 关闭 VM 01-13 15:46:21.801 4689 4689 E    AndroidRunti13 15:46:21.801 4689 4689 E    AndroidRuntime 致命例外:主要 01-13 15:46:21.801 4689 4689 E     AndroidRuntime                              过程: com.enlightenme.pac,PID:4689 01-13 15:46:21.801 4689 4689 E AndroidRuntime                              java.lang.NullPointerException: 尝试调用虚拟方法 'void com.baoyz.swipemenulistview.SwipeMenuItem.setIcon(int)' 为空 对象引用 01-13 15:46:21.801 4689 4689 E     AndroidRuntime 在 com.enlightenme.pac.InterActivity$RemoteDataTask$100000001.onMenuItemClick(InterActivity.java:230) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime 在 com.baoyz.swipemenulistview.SwipeMenuListView$100000000.onItemClick(SwipeMenuListView.java:78) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime 在 com.baoyz.swipemenulistview.SwipeMenuView.onClick(SwipeMenuView.java:85) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime 在 android.view.View.performClick(View.java:4780) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime                            在 android.view.View$PerformClick.run(View.java:19866) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime                            在 android.os.Handler.handleCallback(Handler.java:739) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime                            在 android.os.Handler.dispatchMessage(Handler.java:95) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime                            在 android.os.Looper.loop(Looper.java:135) 01-13 15:46:21.801 4689 4689 E AndroidRuntime                              在 android.app.ActivityThread.main(ActivityThread.java:5254) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime 在 java.lang.reflect.Method.invoke(Native Method) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime                            在 java.lang.reflect.Method.invoke(Method.java:372) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime                            在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 01-13 15:46:21.801 4689 4689 E     AndroidRuntime 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 01-13 15:46:21.796 4689 4689 D     AndroidRuntime 关闭 VM 01-13 15:46:21.801 4689 4689 E     AndroidRunti

【问题讨论】:

  • 您在tag 中存储了什么?我的意思是您在使用setTag() 时存储的值是多少?
  • @RRR SetTag 滑动菜单项或 fvrtbtn?。没听懂你的问题
  • setTag 到 fvrtebutton
  • @RRR 如果它在收藏夹中,那么是的,如果不是的话
  • 你从哪里得到喜欢与否?

标签: android listview


【解决方案1】:

当您在getView 中使用checkFavoriteItem() 来检查它是否在收藏列表中时,您可以在onMenuItemClick 中使用相同的方法。

您将获得点击项目的位置,

 case 1:
     //favorite
      CodeList codes = (CodeList) getItem(position);
      if (checkFavoriteItem(codes))
         //its in favorite list, do coding for remove from favorite
      else
         //its not in favorite list, do coding to add it in favorite

【讨论】:

  • 我现在就试试,让你知道。谢谢
  • 试过了,但是当我点击时,应用程序崩溃了,但是当我重新打开活动时,点击的项目被添加到收藏夹中。贴出我试过的方法和logcat
猜你喜欢
  • 1970-01-01
  • 2012-12-06
  • 2023-03-28
  • 1970-01-01
  • 2013-11-05
  • 2019-07-01
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
相关资源
最近更新 更多