繁体   English   中英

Android如何在我的自定义Listview中实现AsyncTask

[英]Android How to implement AsyncTask in my custom Listview

当我运行代码时,我总是会收到有关“ Skipped 303 frames! The application may be doing too much work on its main thread.的日志Skipped 303 frames! The application may be doing too much work on its main thread. Skipped 303 frames! The application may be doing too much work on its main thread. 如何在下面的代码中实现AsyncTask,以及如何在从我的Parse.com数据库之一中获取数据时显示进度条。 我将不胜感激任何帮助。


这是我的活动代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_doctors_name_list);

    Bundle extras = getIntent().getExtras();
    final String key = extras.getString("KEY");
    ListView lvDoctorsName = (ListView) findViewById(R.id.lvDoctorsName);

    ParseQueryAdapter.QueryFactory<ParseObject> factory = new ParseQueryAdapter.QueryFactory<ParseObject>() {
        public ParseQuery create() {
            ParseQuery query = new ParseQuery("doctors");
            query.whereContains("name", key);
            return query;
        }
    };
    CustomLayout urgentAdapter = new CustomLayout(this, factory);
    lvDoctorsName.setAdapter(urgentAdapter);

    TextView empty = (TextView) findViewById(R.id.empty_list_item);
    lvDoctorsName.setEmptyView(empty);

    itemClickListener();
}

public void itemClickListener() {
    ListView lvDoctorsName = (ListView) findViewById(R.id.lvDoctorsName);
    lvDoctorsName.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            ParseObject item = (ParseObject) parent.getAdapter().getItem(position);
            String objectID = item.getObjectId().toString();
            Intent i = new Intent();
            i.setClass(getApplicationContext(), DoctorPage.class);
            //i.putExtra("new_variable_name",value);
            i.putExtra("objectID", objectID);
            startActivity(i);
        }
    });

}

这是我的自定义布局:

public class CustomLayout extends ParseQueryAdapter<ParseObject> {


public CustomLayout(Context context, QueryFactory<ParseObject> queryFactory) {
    super(context, queryFactory);
}


@Override
public View getItemView(ParseObject object, View v, ViewGroup parent) {
    if (v == null) {
        v = View.inflate(getContext(), R.layout.row, null);
    }
    super.getItemView(object, v, parent);

    TextView titleTextView = (TextView) v.findViewById(R.id.text1);
    titleTextView.setText(object.getString("name"));

    TextView titleTextView2 = (TextView) v.findViewById(R.id.text2);
    titleTextView2.setText(object.getString("city"));

    return v;
}

我看到的一个问题是,每次调用getItemView()时,您都在调用findViewById() findViewById()是一项昂贵的操作。 您应该实现类似ViewHolder模式的方法来避免这种情况。

通过解析文档的外观,他们可以为您处理AsyncTask 所以那不是问题。

根据数据集的大小,伊曼纽尔对findViewById的回答是正确的。

要回答如何显示进度条,您可以阅读ParseQueryAdapter上的文档,该文档可让您了解加载/完成加载触发器。

https://parse.com/docs/android/api/com/parse/ParseQueryAdapter.html

// Perhaps set a callback to be fired upon successful loading of a new set of ParseObjects.
adapter.addOnQueryLoadListener(new OnQueryLoadListener<ParseObject>() {
  public void onLoading() {
    // Trigger any "loading" UI
  }

  public void onLoaded(List<ParseObject> objects, ParseException e) {
    // Execute any post-loading logic, hide "loading" UI
  }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM