2014-06-15 3 views
0

기본적으로, 나는 interprating 제거 기능에 약간의 문제가 있습니다. 사용자가 ListView에있는 버튼을 클릭하면 PopupMenu가 약속되어 "Unfriend", "Unfollow", "Messgae"및 "Cancel"이 표시됩니다. 사용자가 "Unfriend"를 클릭하면, 사용자가 unfreind하기를 원하는 친구는 제거됩니다.ListView w/Popup Menu에서 요소 제거하기

세 가지 문제가 있습니다. 검색 및 제거 (약간 정도) :

사용자가 검색 기능을 사용하면 [친구없는] 옵션을 사용할 수 없게됩니다. 사용자가 unfriend를 클릭하면 아무것도하지 않습니다 ...
사용자가 이전에 친구로 제거한 것보다 사용자를 검색하려고 시도 할 때. 실제로 해당 사용자를 검색 결과에 표시합니다.
사용자가 친구를 제거한 다음 제거 할 다른 친구를 검색합니다. 이전에 제거 된 모든 친구를 목록에 다시 추가합니다.

내가 잘못하고있는 것이 틀림 없습니까? 어쩌면 데이터를 저장 한 다음 다른 곳으로 다시 사용하는 것일까 요?

이 코드의 예외는 없습니다. 실제로 사소한 결함으로 실행됩니다.

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    res = getResources(); 
    searchField = (EditText) findViewById(R.id.EditText01); 
    list = (ListView) findViewById(android.R.id.list); 
    //button = (Button)findViewById(R.id.btnFriendList); 
    list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
    //button.setFocusable(false); 
    friendList = new ArrayList<Friend>(); 

    nameBlock = res.getStringArray(R.array.names); 
    descBlock = res.getStringArray(R.array.descriptions); 

    names = new ArrayList<String>(); 
    for(int i = 0; i < nameBlock.length; i++) { 
     names.add((String)nameBlock[i]); 
    } 
    descr = new ArrayList<String>(); 
    for(int i = 0; i < descBlock.length; i++) { 
     descr.add((String)descBlock[i]); 
    } 
    images = new ArrayList<Integer>(); 
    for(int i = 0; i < imageBlock.length; i++) { 
     images.add((Integer)imageBlock[i]); 
    } 
    //imageBlock = res.getIntArray(R.array.images); 

    int size = nameBlock.length; 
    for(int i = 0 ; i < size; i++) { 
     Log.d("FREINDADD", "Freind Added" + i); 
     friendList.add(new Friend(names.get(i), descr.get(i), images.get(i))); 
    } 
    Log.i("Application", "Application started succesfully..."); 

    adapter = new VirtuAdapter(this); 
    setListAdapter(adapter); 
    Log.i("VIRTU", "Count" + adapter.getCount()); 
    //adapter.getCount(); 


    searchField.addTextChangedListener(new TextWatcher() 
    { 
     @Override public void afterTextChanged(Editable s) {} 
     @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 
     @Override public void onTextChanged(CharSequence s, int start, int before, int count) 
     { 
      friendList.clear(); 
      textlength = searchField.getText().length(); 

      for (int i = 0; i < names.size(); i++) 
      { 
       if (textlength <= names.get(i).length()) 
       { 
        if(names.get(i).toLowerCase().contains(searchField.getText().toString().toLowerCase().trim())) { 
         Log.i("VirtuFriendList", "List recyling in process... "); 
         friendList.add(new Friend(names.get(i), descr.get(i), images.get(i))); 
        } 
        } 
      } 
      AppendList(friendList); 
      } 
    }); 


} 
public void AppendList(ArrayList<Friend> freind) { 
    setListAdapter(new VirtuAdapter(this)); 
} 
public class VirtuAdapter extends BaseAdapter 
{ 


    Activity content; 
    public VirtuAdapter(Activity context) 
    { 
     this.content = context; 
    } 
    @Override 
    public int getCount() 
    { 
     return friendList.size(); 

    } 
    @Override 
    public Object getItem(int position) 
    { 
     return friendList.get(position); 
    } 
    @Override 
    public long getItemId(int position) 
    { 
     return friendList.size(); 
    } 

    class ViewHolder { 
     TextView myTitle; 
     TextView myDescription; 
     ImageView myImage; 
     Button myButton; 

     ViewHolder(View view) { 
      myImage = (ImageView)view.findViewById(R.id.imageview); 
      myTitle = (TextView)view.findViewById(R.id.title); 
      myDescription = (TextView)view.findViewById(R.id.mutualTitle); 
      button = (Button)view.findViewById(R.id.btnFriendList); 
     } 
    } 
    @Override 
    public View getView(final int position, View view, ViewGroup parent) 
    { 
     View row = view; 
     ViewHolder holder = null; 

     if(row == null) 
     { 
      // If it is visible to the user, deploy the row(s) - allocated in local memory 
      LayoutInflater inflater = (LayoutInflater)content .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      row = inflater.inflate(R.layout.search_list_item, parent, false); 
      holder = new ViewHolder(row); 
      row.setTag(holder); 
      Log.d("VIRTU", "Row deployed..."); 
     } 
     else 
     { 
      // Recycle the row if it is not visible to to the user - store in local memory 
      holder = (ViewHolder)row.getTag(); 
      Log.d("VIRTU", "Row recycled..."); 
     } 

     Friend temp = friendList.get(position); 

     friend = friendList.get(position); 
     String length = "SIZE:" + adapter.getCount(); 
     System.out.println("SIZE"+ length); 

     Log.d("VIRTU", length); 
     // Set the resources for each component in the list 
     holder.myImage.setImageResource(temp.getImage()); 
     holder.myTitle.setText(temp.getName()); 
     holder.myDescription.setText(temp.getDesc()); 

     ((Button)row.findViewById(R.id.btnFriendList)).setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
      PopupMenu pop = new PopupMenu(getApplicationContext(),v); 
      MenuInflater inflater = pop.getMenuInflater(); 

      inflater.inflate(R.menu.firned_popup_action, pop.getMenu()); 
       friend.setPosition(position); 
       Toast.makeText(content, "" + position, Toast.LENGTH_SHORT).show(); 
       pop.show(); 
       pop.setOnMenuItemClickListener(MainActivity.this); 
      } 
     }); 

    return row; 
    } 
} 
@Override 
public boolean onMenuItemClick(MenuItem item) { 
    int choice = item.getItemId(); 

    switch(choice) { 
    case R.id.message: 
     Toast.makeText(getApplicationContext(),"Clicked on Message", Toast.LENGTH_SHORT).show(); 
     break; 
    case R.id.unfollow: 
     Toast.makeText(getApplicationContext(),"Clicked on Unfollow", Toast.LENGTH_SHORT).show(); 

     break; 
    case R.id.unfriend: 
     Toast.makeText(getApplicationContext(),"Clicked on Unfreind", Toast.LENGTH_SHORT).show(); 
     Friend temp = friendList.get(friend.getPosition()); 

     friendList.remove(temp);    
     adapter.notifyDataSetChanged(); 
     adapter.notifyDataSetInvalidated(); 
     break; 
    case R.id.cancel: 
     Toast.makeText(getApplicationContext(),"Clicked on Cancel", Toast.LENGTH_SHORT).show(); 
     break; 
     default: break; 
    } 
    return false; 
} 

}

+0

'ArrayAdapter'를 사용해보세요. 당신을 위해 경이로울 것입니다;) –

답변

0

문제는 position가 저장되는 방법을 방법입니다. 단추 클릭 수신기가 호출 될 때 position 값은 단추를 클릭 한 행이 아닙니다. 올바른 값을 얻으려면 getView()가 호출 될 때 ViewHolder 객체의 위치를 ​​저장하고 버튼 클릭 수신기를 if(row == null) 블록으로 이동해야합니다. getView()를 호출 할 때마다 클릭 리스너를 설정할 필요가 없습니다. 레이아웃을 만들 때만 설정하면됩니다. 이 작업이 어떻게 수행되는지 보려면 유사한 질문 인 answer을 참조하십시오.

+0

미안 해요. 무슨 뜻인지 미안 해요? 그것은 ListView에서 요소를 제거합니다. 내가 뭔가를 찾을 때 혼란스러워지기 시작합니다. – peteratkinson1

+0

오 세상에! 나는 그것을 고쳤고 완벽하게 작동한다! 지칠 줄 모르는 프로그래밍에 5 일을 정말 고맙습니다. 마침내 작동합니다! 너는 믿을 수 없다! 엄지 손가락! 고맙습니다. – peteratkinson1

관련 문제