Android键盘显示会影响布局

时间:2015-03-04 04:32:43

标签: android

请帮助我解决这个问题,我试着解决它3天但没有任何效果。

我有一个SearchView,一个Fragment,一个显示列表项的ArrayAdapter,一切正常但有一个问题,每当我点击SearchView时键盘显示/隐藏,MyArrayAdapter中的方法getView被调用,所有列表中的项目是重新加载,我不想发生因为每个项目都有一个ImageView,图像是从带有AsyncTask的URL加载的。我不知道这是不是正常行为,请帮助我。

在Fragment中,创建ArrayAdapter

        final SubjectArrayAdapter adapter = new SubjectArrayAdapter(getActivity(), list);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(getActivity(), "SUBJECT ID: " + view.getId(), Toast.LENGTH_LONG).show();
            }
        });

在ArrayAdapter中

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View rowView = null;
    try {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowView = inflater.inflate(R.layout.row_layout, parent, false);
        TextView firstTextView = (TextView) rowView.findViewById(R.id.firstLine);
        TextView secondTextView = (TextView) rowView.findViewById(R.id.secondLine);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);
        firstTextView.setText(list.get(position).getSubjectName());
        secondTextView.setText(list.get(position).getDescription());
        Toast.makeText(context, "" + list.get(position).getSubjectId(), Toast.LENGTH_SHORT).show();
        new DownloadImageTask(imageView).execute(list.get(position).getIconUrl());
        rowView.setId(list.get(position).getSubjectId());
    } catch (Exception e) {
        Log.e("SubjectArrayAdapter!getView", e.toString());
    }
    return rowView;
}

SearchView是正常的SearchView,没什么特别的,我把它改成了EditText,问题还在发生,我用的是没有键盘显示的模拟器,没有任何事情发生,所以我唯一猜测的问题在于事件的显示/隐藏键盘。

由于

修改

感谢大家的支持,我找到毕加索lib,希望我早点知道,我只需更改1行代码

new DownloadImageTask(imageView).execute(list.get(position).getIconUrl());

这一个

Picasso.with(context).load(list.get(position).getIconUrl()).fit().into(imageView);

1 个答案:

答案 0 :(得分:0)

隐藏和显示键盘输入会导致视图运行另一个布局传递(因为窗口大小已更改),这会触发ListView请求适配器再次将数据绑定到视图。

在这样的适配器回调中启动长时间运行的下载任务并不是一个好习惯。有许多用户行为会导致您的框架多次请求这些视图,并且您的应用程序将继续旋转。如果用户旋转设备,甚至快速滚动列表,您将遇到完全相同的问题。

查看开发者指南的Efficient Bitmaps部分,该部分讨论了正确处理位图的下载,处理和缓存技术。