Android ListView 复制 onclicking 项目

Android ListView duplicating onclicking an item

我的列表视图有问题。实际上我已经从 Facebook Like Custom Feed 实施了 Facebook Like Feed 它正在从 MySQL 数据库中获取数据。在每个列表项的底部,我都有一个来自这个库 Material Favourite Button 的“赞”按钮。我的问题是,当我点击第一个列表项时,第 5 个列表项会自动被点赞,如果我点击第 2 个列表项,第 4 个列表项会被点赞,依此类推。我尝试了我能做的一切,但没有解决这个问题。我尝试按照此处各种已回答问题的建议,将视图持有者也添加到我的列表适配器 class 中,但这并没有解决我的问题。请帮助!下面是我的适配器 class:

 public class FeedListAdapter extends BaseAdapter {
    private Activity activity;

    private int lastPosition = -1;
    private DatabaseHandler db;
    ViewHolder holder;
      int id = 0;
    String email;

    private List<FeedItem> feedItems;

    ImageLoader imageLoader = AppController.getInstance().getImageLoader();

    public FeedListAdapter(Activity activity, List<FeedItem> feedItems) {
        this.activity = activity;
        this.feedItems = feedItems;
    }

    @Override
    public int getCount() {
        return feedItems.size();
    }

    @Override
    public Object getItem(int location) {
        return feedItems.get(location);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {



        if (convertView == null){
            LayoutInflater inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.feed_item, parent,false);
            holder = new ViewHolder();
            holder.materialFavoriteButtonNice =
                    (MaterialFavoriteButton) convertView.findViewById(R.id.like_anim);
            convertView.setTag(holder);
        }else{

            holder = (ViewHolder)convertView.getTag();
        }

        if (imageLoader == null)
            imageLoader = AppController.getInstance().getImageLoader();


            TextView name = (TextView) convertView.findViewById(R.id.name);
            TextView timestamp = (TextView) convertView
                    .findViewById(R.id.timestamp);
            //get User Email
            db = new DatabaseHandler(activity.getApplication());
            db = new DatabaseHandler(activity.getApplication());
            HashMap<String, String> user = db.getUserDetails();
            email = user.get("email").toString();
            // End get User Email ID for sending it to db

        //Getting Views from Layout


        TextView statusMsg = (TextView) convertView
                .findViewById(R.id.txtStatusMsg);
        TextView url = (TextView) convertView.findViewById(R.id.txtUrl);
        final TextView like = (TextView) convertView.findViewById(R.id.like_box_no);
        TextView share = (TextView) convertView.findViewById(R.id.share_no);
        TextView comment = (TextView) convertView.findViewById(R.id.comment_no);
        NetworkImageView profilePic = (NetworkImageView) convertView
                .findViewById(R.id.profilePic);

        FeedImageView feedImageView = (FeedImageView) convertView
                .findViewById(R.id.feedImage1);
        //End Getting Views from Layout

        final FeedItem item = feedItems.get(position);
        name.setText(item.getName());

        // Converting timestamp into x ago format
        CharSequence timeAgo = DateUtils.getRelativeTimeSpanString(
                Long.parseLong(item.getTimeStamp()),
                System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS);
        timestamp.setText(timeAgo);

        // Check for empty status message
        if (!TextUtils.isEmpty(item.getStatus())) {
            statusMsg.setText(item.getStatus());
            statusMsg.setVisibility(View.VISIBLE);
        } else {
            // status is empty, remove from view
            statusMsg.setVisibility(View.GONE);
        }
        // Chcek for empty Like
        if (!TextUtils.isEmpty(item.getLike())) {
            like.setText(item.getLike());
            like.setVisibility(View.VISIBLE);
        } else {
            // status is empty, remove from view
            like.setText("0");
        }
        // Chcek for empty Comment
        if (!TextUtils.isEmpty(item.getComment())) {
            comment.setText(item.getComment());
            comment.setVisibility(View.VISIBLE);
        } else {
            // status is empty, remove from view
            comment.setText("0");
        }
        // Chcek for empty Share
        if (!TextUtils.isEmpty(item.getShare())) {
            share.setText(item.getShare());
            share.setVisibility(View.VISIBLE);
        } else {
            // status is empty, remove from view
            share.setText("0");
        }
        if (item.getFav().equals("1")) {
            holder.materialFavoriteButtonNice.setFavorite(true, false);
            holder.materialFavoriteButtonNice.setVisibility(View.VISIBLE);

        } else {
            // status is empty, remove from view
            holder.materialFavoriteButtonNice.setFavorite(false, false);
        }

        // Checking for null feed url
        if (item.getUrl() != null) {
            url.setText(Html.fromHtml("<a href=\"" + item.getUrl() + "\">"
                    + item.getUrl() + "</a> "));

            // Making url clickable
            url.setMovementMethod(LinkMovementMethod.getInstance());
            url.setVisibility(View.VISIBLE);
        } else {
            // url is null, remove from the view
            url.setVisibility(View.GONE);
        }

        // user profile pic
        profilePic.setImageUrl(item.getProfilePic(), imageLoader);
        imageLoader.get(item.getProfilePic(), ImageLoader.getImageListener(profilePic, R.drawable._businessman, R.drawable._businessman));

        // Feed image
        if (item.getImge() != null) {
            feedImageView.setImageUrl(item.getImge(), imageLoader);
            feedImageView.setVisibility(View.VISIBLE);
            feedImageView
                    .setResponseObserver(new FeedImageView.ResponseObserver() {
                        @Override
                        public void onError() {
                        }

                        @Override
                        public void onSuccess() {
                        }
                    });
        } else {
            feedImageView.setVisibility(View.GONE);
        }

        //Animating the List View
        Animation animation = AnimationUtils.loadAnimation(activity.getApplication(), (position > lastPosition) ? R.anim.up_from_bottom : R.anim.down_from_top);
        convertView.startAnimation(animation);
        lastPosition = position;
        //End Animating the List View

        //onClick Like


holder.materialFavoriteButtonNice.setOnFavoriteChangeListener(new MaterialFavoriteButton.OnFavoriteChangeListener() {
    @Override
    public void onFavoriteChanged(MaterialFavoriteButton buttonView, boolean favorite) {
        id = item.getId();
        Log.d("inFavChngeListner", "Clickd" + item.getId());
        Toast.makeText(activity.getApplication(), "Fav Changed : " + item.getId(), Toast.LENGTH_SHORT).show();
        if (favorite) {


            new send_json().execute();

        } else {

            holder.materialFavoriteButtonNice.setFavorite(false, true);
            new send_json_unlike().execute();
        }
    }
});
        return convertView;


    }
     static class ViewHolder {
        MaterialFavoriteButton materialFavoriteButtonNice;
    }

    //Sending Likes with email id and feed id to Remote Mysql Db
    public class send_json extends AsyncTask<String, String, JSONObject> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            if(!holder.materialFavoriteButtonNice.isFavorite())
            holder.materialFavoriteButtonNice.setFavorite(true, true);
        }

        @Override
        protected JSONObject doInBackground(String... params) {
            UserFunctions userFunction = new UserFunctions();

            JSONObject json = userFunction.like_func(email, String.valueOf(id));
            Log.d("BG Like, Email:" + email + "Id: " + String.valueOf(id), json.toString());
            return json;
        }

        @Override
        protected void onPostExecute(JSONObject jsonObject) {
            super.onPostExecute(jsonObject);
if(!holder.materialFavoriteButtonNice.isFavorite())
            holder.materialFavoriteButtonNice.setFavorite(true, true);
        }
    }
    //Sending Likes with email id and feed id to Remote Mysql Db
    public class send_json_unlike extends AsyncTask<String, String, JSONObject> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            if(!holder.materialFavoriteButtonNice.isFavorite())
                holder.materialFavoriteButtonNice.setFavorite(false, true);
        }

        @Override
        protected JSONObject doInBackground(String... params) {
            UserFunctions userFunction = new UserFunctions();

            JSONObject json = userFunction.unlike_func(email, String.valueOf(id));
            Log.d("BG UnLike, Email:" + email + "Id: " + String.valueOf(id), json.toString());
            return json;
        }

        @Override
        protected void onPostExecute(JSONObject jsonObject) {
            super.onPostExecute(jsonObject);
            if(!holder.materialFavoriteButtonNice.isFavorite())
                holder.materialFavoriteButtonNice.setFavorite(false, true);
        }
    }
}

不要使用全局 ViewHolder 实例。使其在功能范围内。并尝试改变逻辑。仅更新数组内的模型并调用 notifyDataSetChanged() 方法。我认为它会解决您的问题。