2017-12-08 8 views
0

내 목록보기 항목에 제거 단추가 포함되어 있으며이를 데이터베이스에서 항목을 제거하기 위해 어댑터에 설정했습니다. 이제 일단 완료되면 listView가 포함 된 조각을 새로 고쳐 해당 항목을 제거 할 수 있습니까? 아래와 같이 관련 코드 :ListView는 항상 마지막 항목을 삭제합니다.

제거 항목 기능 어댑터 :

holder.actionIndicator.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      AlertDialog alertDialog = new AlertDialog.Builder(mContext).create(); 
      alertDialog.setTitle("Delete item"); 
      alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "yes", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 

          FirebaseMethods firebaseMethods = new FirebaseMethods(mContext); 
          firebaseMethods.deleteHashtagFromDatabase(title); 

          dialog.dismiss(); 
         } 
        }); 
      alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "no", 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          dialog.dismiss(); 
         } 
        }); 


        alertDialog.show(); 


     } 
    }); 

목록보기는 설정 내 조각이 같다 :

private void setupListView(){ 

    Log.d(TAG, "setupListView: setting up list"); 
    final ArrayList<HashTag> hashTags = new ArrayList<>(); 
    myRef = FirebaseDatabase.getInstance().getReference(); 
    Query query = myRef.child(getString(R.string.dbname_user_hashtags)) 
      .child(FirebaseAuth.getInstance().getCurrentUser().getUid()); 
    query.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){ 


       if(singleSnapshot != null){ 
        hashTags.add(0, singleSnapshot.getValue(HashTag.class)); 
       } 

      } 

      HashTagListViewAdapter adapter = new HashTagListViewAdapter(getActivity(), R.layout.layout_list_itemview, hashTags); 
      hashtagListView.setAdapter(adapter); 



     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

감사합니다!

UPDATE :

업데이트 어댑터

holder.actionIndicator.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      ((ListView) parent).performItemClick(v, position, 0); 



     } 
    }); 

업데이트 조각 :

가 지금은 아래와 같이 조각의 ListView OnItemClickListener에 어댑터에서 하위 항목에 OnClickListener를 통과

hashtagListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, final int position, long id) { 


      long viewId = view.getId(); 
      Log.d(TAG, "onItemClick: viewId is " + viewId); 
      Log.d(TAG, "onItemClick: position is " + position); 

      final HashTagListViewAdapter adapter = new HashTagListViewAdapter(getActivity(), R.layout.layout_list_itemview, hashTags); 
      final HashTag hashTag = hashTags.get(position); 
      final String title = hashTag.getTitle(); 
      Log.d(TAG, "onItemClick: title is " + title); 


      if(viewId == R.id.deleteFromListBtn){ 

       AlertDialog alertDialog = new AlertDialog.Builder(getActivity()).create(); 
       alertDialog.setTitle("delete item"); 
       alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "yes", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int which) { 

           FirebaseMethods firebaseMethods = new FirebaseMethods(getActivity()); 
           firebaseMethods.deleteHashtagFromDatabase(title); 
           Log.d(TAG, "onClick: title is " + title); 

           // NEW PROBLEM HERE! 
           adapter.remove(hashTag); 
           Log.d(TAG, "onClick: removed hashtag is " + hashTag); 
           adapter.notifyDataSetChanged(); 

           Log.d(TAG, "onItemClick: item removed from list."); 

           dialog.dismiss(); 
          } 
         }); 
       alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "no", 
         new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 
           dialog.dismiss(); 
          } 
         }); 


       alertDialog.show(); 


      } 
     } 
    }); 

하지만 문제는 내가 항목을 삭제할 때 listView가 항상보기의 마지막 항목을 삭제한다는 것입니다. 그러나 올바른 항목이 데이터베이스에서 삭제되었으며 로그에 따라이 코드 adapter.remove(hashTag)이 삭제하려는 올바른 항목을 가져옵니다.

답변

0

우선, 전체를 새로 고치면 안됩니다. Fragment. 나쁜 습관

ListView,

  1. 먼저 ArrayList (라는 이름의 '해시 태그')에서 항목을 제거 새로 고침합니다.
  2. 그리고 YOUR_ADAPTER.notifyDataSetChanged()으로 전화하십시오.

notifyDataSetChanged()는 자동으로 ListView에서 항목을 제거합니다.

Use of notifyDataSetChanged()

+0

나는 listview의 하위 항목에 대한 어댑터의 OnClickListener에서 제거 작업을 정의해야합니다. 따라서 OnClickListener는 조각의 listView ItemOnClickListener에 설정되지 않았습니다.그 부분을 수정했지만 새로운 문제가 나타납니다. 내 편집을 참조하십시오. 감사! – user8795747

0

먼저 데이터베이스에서 항목을 제거해야 성공 데이터베이스에서 올 때 다음 항목의 ArrayList에서 제거하고 어댑터가 ArratList에서 변경에 대해에게 알립니다해야한다.

ArrayList 양식 어댑터 클래스에서 항목을 제거하려면.

//postion is the location of item in the arraylist to be deleted. 
dataSet.remove(position); 

이제 ArrayList의 변경 사항에 대한 어댑터를 알리십시오. Adapter 클래스와 같이 호출되어야합니다.

notifyDataSetChanged(); 
+0

것은 목록보기의 하위 항목에 대한 어댑터의 OnClickListener에서 제거 작업을 정의해야합니다. 따라서 OnClickListener는 조각의 listView ItemOnClickListener에 설정되지 않았습니다. 그 부분을 수정했지만 새로운 문제가 나타납니다. 내 편집을 참조하십시오. 감사! – user8795747

+0

adapter.remove (hashTags.get (position)); 그것을 시도 해시 태그 수 있습니다 마지막 항목의 참조를 저장합니다. –

+0

안녕하세요, 업데이트 해 주셔서 감사합니다. 삭제 작업 후에 어댑터를 다시 설정하여 문제를 해결했습니다. 'hashtagListView.setAdapter (adapter);'다른 질문에서 아이디어를 얻었지만 notifyDataSetChanged가 작동하지 않는 이유를 여전히 이해할 수 없습니다 ... – user8795747