【问题标题】:Removing elements in ListView w/ Popup Menu使用弹出菜单删除 ListView 中的元素
【发布时间】:2014-08-05 16:18:02
【问题描述】:

基本上,我在解释删除功能时遇到了一点问题。用户单击 ListView 中的按钮,然后弹出 PopupMenu 并显示“Unfriend”、“Unfollow”、“Messgae”和“Cancel”。当用户点击“解除好友”时,用户想要解除好友的好友随即被删除。

我对三件事有疑问;搜索和删除(轻微程度):

1 当用户使用搜索功能时,取消好友选项变为不可用。如果用户点击取消好友。它什么都不做...
2 当用户尝试搜索比他们之前删除为朋友的用户时。它实际上会在搜索结果中显示该用户。
3 当用户删除朋友,然后搜索要删除的另一个朋友时。它将所有以前删除的朋友添加回列表中。

一定是我做错了什么?也许我正在存储数据,然后在一定程度上重新使用它?

我没有从这段代码中得到任何异常。它实际上运行时有一些小故障。

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;
}

}

【问题讨论】:

  • 尝试使用ArrayAdapter,它会为你创造奇迹;)

标签: java android listview custom-adapter popupmenu


【解决方案1】:

问题在于position 的存储方式。调用按钮单击侦听器时,position 值不是单击按钮的行。要获得正确的值,您需要在调用 getView() 时将位置保存在 ViewHolder 对象中,并将按钮单击侦听器移动到 if(row == null) 块中。无需在每次调用 getView() 时设置点击监听器。它只需要在创建布局时设置。要了解这是如何完成的,请查看类似问题的answer

【讨论】:

  • 对不起,我不太明白你的意思?它正在删除 ListView 中的元素。只有当我搜索某些东西时,事情才会开始混乱。
  • 天哪!我已经修复了它,它完美无缺!非常感谢您 5 天不知疲倦的编程,终于成功了!你太棒了!竖起大拇指!谢谢你hfann
猜你喜欢
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多