如何在更改适配器数据之前暂时停止单击效果?

时间:2014-12-21 23:04:04

标签: android android-listview

背景

从listView中选择项目时,我会更改其数据并调用notifyDataSetChanged。

问题

由于它是相同的listView,当我单击该项时,效果将保留在notifyDataSetChanged之后将使用的视图。

这在Android Lollipop上尤为明显,在使用新数据刷新listView后,纹波可以继续。

代码

以下是显示问题的示例代码:

public class MainActivity extends ActionBarActivity
  {

  @Override
  protected void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ListView listView=(ListView)findViewById(R.id.listView);
    listView.setAdapter(new BaseAdapter()
    {
    int pressCount=0;

    @Override
    public int getCount()
      {
      return 100;
      }

    @Override
    public Object getItem(int position)
      {
      return null;
      }

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

    @Override
    public View getView(int position,View convertView,ViewGroup parent)
      {
      View rootView=convertView;
      if(rootView==null)
        {
        rootView=LayoutInflater.from(MainActivity.this).inflate(android.R.layout.simple_list_item_1,parent,false);
        rootView.setBackgroundResource(getResIdFromAttribute(MainActivity.this,android.R.attr.selectableItemBackground));
        rootView.setOnClickListener(new View.OnClickListener()
        {
        @Override
        public void onClick(View v)
          {
          pressCount++;
          notifyDataSetChanged();
          }
        });
        }
      TextView tv=(TextView)rootView;
      tv.setText("text:"+(pressCount+position));
      return rootView;
      }
    });
    }

  public static int getResIdFromAttribute(final Activity activity,final int attr)
    {
    if(attr==0)
      return 0;
    final TypedValue typedvalueattr=new TypedValue();
    activity.getTheme().resolveAttribute(attr,typedvalueattr,true);
    return typedvalueattr.resourceId;
    }

  }

问题

如何暂时停止选择效果,直到下次在listView上点击任何内容(但也会在下次用户点击某个项目时恢复允许它)?

1 个答案:

答案 0 :(得分:2)

好的,我找到了答案。这似乎是一个已知问题,解决方案非常简单(显示为here):

ViewCompat.jumpDrawablesToCurrentState(view);

奇怪的是,只有当我通过Handler.post(...)调用它时,它才适用于我。

不知道为什么(因为视图已经在动画期间),以及是否有更好的解决方案。