从适配器内的视图中删除项目

时间:2016-09-26 08:39:17

标签: android

当我的标志变为4时,我试图从视图中删除一个项目。我尝试了mObjects.remove(position),然后是notifyDataSetChanged()。但它没有奏效。我们尝试了以下所有

  if (getItem(position).getFlag().trim().equalsIgnoreCase("4")) {


            remove(position);
            adapter.notifyDataSetChanged();
            matcheslistview.setAdapter(adapter);
      also this one
          //  mObjects.remove(position)
          // notifyDataSetChanged();

      and this one
           // mObjects.remove(position);
           //remove(position);
           //mainObjects.remove(position);
           //notifyDataSetChanged();

      and this one
        // Object toRemove = adapter.getItem(position);
        // mObjects.remove(toRemove);
        //  mObjects.clear();

并且我们一直得到java.lang.IndexOutOfBoundsException:索引1无效,大小为0.这是完整的适配器类

 private class MatchedDataAdapter extends BaseAdapter implements Filterable {
    private AQuery aQuery;
    private Activity mActivity;
    private LayoutInflater mInflater;
    private SessionManager sessionManager;

    private int uflag;
    MyFilter mfilter;
    DatabaseHandler db;
    ArrayList<LikeMatcheddataForListview> mObjects;
    ArrayList<LikeMatcheddataForListview> mainObjects;

    Context context;

    public MatchedDataAdapter(Activity context,
                              ArrayList<LikeMatcheddataForListview> objects,
                              int imageHeigthAndWidth[]) {

        this.mObjects = objects;
        mainObjects = objects;
        //Log.e("size", Integer.toString(mObjects.size()));

        this.mActivity = context;
        try {
            mInflater = (LayoutInflater) mActivity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
        catch (Exception e)

        {
            e.printStackTrace();
        }

        aQuery = new AQuery(context);
        db = new DatabaseHandler(context);

    }

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

    @Override
    public LikeMatcheddataForListview getItem(int position) {
        return mObjects.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
            holder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.matchedlistviewitem,
                    null);
            holder.imageview = (ImageView) convertView
                    .findViewById(R.id.userimage);
            holder.textview = (TextView) convertView
                    .findViewById(R.id.userName);
            holder.lastMasage = (TextView) convertView
                    .findViewById(R.id.lastmessage);

            holder.imgStatus = (ImageView) convertView
                    .findViewById(R.id.imgStatus);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }


        holder.textview.setText(getItem(position).getUserName());



        if (getItem(position).getFlag().trim().equalsIgnoreCase("4")) {


            mObjects.remove(position);
            adapter.notifyDataSetChanged();
            matcheslistview.setAdapter(adapter);

我们要删除带有标志4的Item,我们正在使用db中的服务读取此标志并且onrecive我们将类DisplayContentTask调用如下

 class GetLikeMatchedReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        new DisplayContentTask(intent).execute();
    }
}

我们如何获取物品位置以便移除带有标志4的物品......或者我是另一种移除物品4的方法我们不知道但是感谢您对此的帮助

  class DisplayContentTask extends AsyncTask<Void, Void, Void> {

    Intent intent;

    private Ultilities mUltilities = new Ultilities();
    private List<NameValuePair> getuserparameter;
    private String likedmatchedata, Unmatchedata;
    int match1;
    private LikedMatcheData matcheData;
    private ArrayList<com.appdupe.flamer.pojo.Likes> likesList;
    private LikeMatcheddataForListview matcheddataForListview;
    DatabaseHandler mDatabaseHandler = new DatabaseHandler(getActivity());
    private boolean isResponseSuccess = true;
    ArrayList<LikeMatcheddataForListview> tempArray = new         ArrayList<LikeMatcheddataForListview>();


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        AppLog.Log(TAG, "BackgroundTaskForFindLikeMatched onPreExecute  ");


    }

    DisplayContentTask(Intent intent) {
        this.intent = intent;
    }

    @Override
    protected Void doInBackground(Void... voids) {


        try {

            File appDirectory = mUltilities
                    .createAppDirectoy(getResources().getString(
                            R.string.appdirectory));
            AppLog.Log(TAG,
                    "BackgroundTaskForFindLikeMatched   doInBackground appDirectory "
                            + appDirectory);
            File _picDir = new File(appDirectory, getResources().getString(
                    R.string.imagedirematchuserdirectory));

            AppLog.Log(TAG,
                    "BackgroundTaskForFindLikeMatched doInBackground ");

            // getuserparameter = mUltilities.getUserLikedParameter(params);


            likedmatchedata = intent.getStringExtra("GET_MATCHED_RESPONSE");
            //   Unmatchedata = intent.getStringExtra("GET_UNMATCHED_RESPONSE");//hadi

            AppLog.Log(TAG,
                    "BackgroundTaskForFindLikeMatched doInBackground   likedmatchedata "
                            + likedmatchedata);

            Gson gson = new Gson();
            matcheData = gson.fromJson(likedmatchedata,
                    LikedMatcheData.class);

            AppLog.Log(TAG,
                    "BackgroundTaskForFindLikeMatched doInBackground   matcheData "
                            + matcheData);

            // "errNum": "51",
            // "errFlag": "0",
            // "errMsg": "Matches found!",

            if (matcheData.getErrFlag() == 0) {

                likesList = matcheData.getLikes();
                AppLog.Log(TAG,
                        "BackgroundTaskForFindLikeMatched doInBackground   likesList "
                                + likesList);
                if (tempArray != null) {
                    tempArray.clear();
                }

                AppLog.Log(TAG,
                        "BackgroundTaskForFindLikeMatched doInBackground   likesList sized "
                                + likesList.size());
                Log.v("Matches", "" + likesList.size());
                match1 = likesList.size();

                for (int i = 0; i < likesList.size(); i++) {
                    Log.d("likelist", likesList.toString());
                    matcheddataForListview = new LikeMatcheddataForListview();
                    String userName = likesList.get(i).getfName();
                    String facebookid = likesList.get(i).getFbId();
                    // Log.i(TAG, "Background facebookid......"+facebookid);
                    String picturl = likesList.get(i).getpPic();
                    int falg = likesList.get(i).getFlag();
               //     if (likesList.get(i).getFlag()==4) {
                //        likesList.remove(getId());
                //    }

                    Log.i("komak10",""+likesList.get(i).getFlag());
                    String latd = likesList.get(i).getLadt();
                    matcheddataForListview.setFacebookid(facebookid);
                    matcheddataForListview.setUserName(userName);
                    matcheddataForListview.setImageUrl(picturl);
                    matcheddataForListview.setFlag("" + falg);
                    matcheddataForListview.setladt(latd);
                    // matcheddataForListview.setFilePath(filePath);
                    File imageFile = mUltilities.createFileInSideDirectory(
                            _picDir, userName + facebookid + ".jpg");
                    // logDebug("BackGroundTaskForUserProfile doInBackground imageFile is profile "+imageFile.isFile());
                    Utility.addBitmapToSdCardFromURL(likesList.get(i)
                            .getpPic().replaceAll(" ", "%20"), imageFile);
                    matcheddataForListview.setFilePath(imageFile
                            .getAbsolutePath());

                    if (!preferences.getString(Constant.FACEBOOK_ID, "")
                            .equals(facebookid)) {
                        tempArray.add(matcheddataForListview);

                    }

                }
                DatabaseHandler mDatabaseHandler = new DatabaseHandler(
                        getActivity());
                // SessionManager mSessionManager = new SessionManager(
                // MainActivity.this);
                String userFacebookid = preferences.getString(
                        Constant.FACEBOOK_ID, "");

                //
                boolean isdataiserted = mDatabaseHandler.insertMatchList(
                        tempArray, userFacebookid);

            } else if (matcheData.getErrFlag() == 1) {
                if(tempArray!=null)
                {
                    tempArray.clear();
                }

            } else {
                // do nothing
            }

        } catch (Exception e) {
            AppLog.handleException(
                    "BackgroundTaskForFindLikeMatched doInBackground Exception ",
                    e);
            // some thing wrong happend
            isResponseSuccess = false;
        }



        return null;
    }

3 个答案:

答案 0 :(得分:1)

请尝试以下

您的代码

if (getItem(position).getFlag().trim().equalsIgnoreCase("4")) {


            mObjects.remove(position);
            adapter.notifyDataSetChanged();
            matcheslistview.setAdapter(adapter);
}

不要再次将适配器设置为列表视图

if (getItem(position).getFlag().trim().equalsIgnoreCase("4")) {

           mObjects.remove(position);
            notifyDataSetChanged();

}

答案 1 :(得分:1)

这可能不是删除listview项目的正确方法。

每当您的adapter数据发生变化时,只需检查该标志是否与您的字符串匹配,即每个项目中的“4”,并从列表中删除相应的项目,然后只需拨打位置notifyItemRemoved即可notifyDataSetChanged

答案 2 :(得分:1)

不要删除getview中的对象,如果必须对其进行过滤,请在发送到适配器之前对其进行过滤。有可能在创建子视图时,第一个单元格有标记“4”,现在视图没有创建(因为没有调用返回)但是你试图删除它的位置,所以它肯定会给你IndexOutOfBoundsException。

我最好的解决方案是,用

设置适配器
new ArrayList<LikeMatcheddataForListview>() 

每当你启动屏幕时。一旦您的AsyncTask完成过滤掉标记为“4”的子项(更好地在asynctask中过滤掉,在ui线程中减少任务)然后刷新适配器,如

public void refresh(ArrayList<LikeMatcheddataForListview>() arrObjects){
   objects = arrObjects;
   notifyDataSetChanged();
}

检查一下,它应该做的伎俩