Android onListItemClick有时会触发

时间:2016-03-20 23:48:35

标签: android listview android-listfragment notifydatasetchanged

我有一个带有ImageView的自定义Listview用于绘图。在我的Mainactivity中,我开始一个线程,每隔20ms在我的Listview中重绘一次ImageView。 只在我的Listfragment中调用 adapter.notifyDataSetChanged(); 时,才会刷新ImageView。 这工作正常,但我的问题是,onListItemClick有时在这种情况下会触发。当我删除adapter.notifyDataSetChanged()时,onListItemClick总是会激活但是现在,我的ImageViews不会刷新。

这是我的代码的重要部分:

public class FragmentOscilloscope extends ListFragment
{
    private ListViewAdapter adapter;
    private List<ListViewItem> rowItems;
    private Handler sampleUpdateHandler = null;

    @Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        sampleUpdateHandler = new Handler();
    }

    public void InitFragment()
    {
        adapter = new ListViewAdapter(getActivity(), rowItems);
        setListAdapter(adapter);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id)
    {
        super.onListItemClick(l, v, position, id);
        Log.d("FragmentOscilloscope", "onListItemClick");
    }

    public void UpdateOscilloscope(final PositionMarker pos)
    {
        for (int i = 0; i < listItems; i++);
        {
            Canvas canvas = rowItems.get(i).getCanvas();
            // do the drawings
        }

        sampleUpdateHandler.post(new Runnable()
        {
            @Override
            public void run()
            {
                adapter.notifyDataSetChanged();
            }
        });
    }
}

这是我的ListViewAdapter中的getView():

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    ListViewItem row_pos = rowItem.get(position);

    if (convertView == null)
    {
        convertView = mInflater.inflate(R.layout.oscilloscope_list_item, parent, false);
    }
    imageView = (ImageView) convertView.findViewById(R.id.osc_image);
    imageView.setImageBitmap(row_pos.getBitmap());
    row_pos.setImageView(imageView);
    return convertView;
}

有人可以帮我吗?我真的很沮丧......谢谢!

您还可以在此处找到所描述行为的完整代码: Android ListFragment update/refresh and onItemClick

1 个答案:

答案 0 :(得分:1)

  

当我删除adapter.notifyDataSetChanged()时,onListItemClick总会立即触发,但我的ImageViews不会刷新。

当您致电var date = moment(); date.toISOString(); 时,notifyDataSetChanged()中的项目将会初始化并再次绘制。导致listview触发的主要原因是因为当时你的UI线程非常繁忙,它正在处理其他任务,并且onListItemClick命令将被放在任务队列上进行处理。

我想在onListItemClick来自getView()你执行非常繁重的任务,尝试改进它或为繁重的进程创建adapter。希望它有所帮助。

任何方式,如果您在代码中提供更多详细信息(Thread/AsynTask是一个好点),我认为有些人可以提供很多帮助。