天天看點

Loader異步加載架構下自定義Loader

  • 自定義資料類型

    */

    public class UserBean {

    private String userName;

    private String passWord;

    public UserBean(String userName, String passWord) {

    this.userName = userName;

    this.passWord = passWord;

    }

    public String getUserName() {

    return userName;

    }

    public void setUserName(String userName) {

    this.userName = userName;

    }

    public String getPassWord() {

    return passWord;

    }

    public void setPassWord(String passWord) {

    this.passWord = passWord;

    }

    }

//自定義UserLoader

public class UserLoader extends AsyncTaskLoader<List> {

public UserLoader(@NonNull Context context) {
    super(context);
}

@Override
protected void onStartLoading() {
    super.onStartLoading();
    //如果Load啟動了,強制執行loadInBackground
    if (isStarted()){
        forceLoad();
    }
}

/**
 * 在子線程加載資料
 * @return
 */
@Nullable
@Override
public List<UserBean> loadInBackground() {

    //模拟從網絡傳回資料
    List<UserBean> list=new ArrayList<>();
    list.add(new UserBean("張學友","12345"));
    list.add(new UserBean("劉德華","12345"));
    list.add(new UserBean("林青霞","12345"));
    list.add(new UserBean("張曼玉","12345"));
    return list;
}
           

}

//業務處理

public class CustomLoaderActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<List> {

private List<UserBean> users=new ArrayList<>();
private ListView mListView;
private LoaderManager loaderManager;
private UserAdapter mAdapter;

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

    mListView = findViewById(R.id.custom_listView);
    mAdapter = new UserAdapter();
    mListView.setAdapter(mAdapter);

    loaderManager = getSupportLoaderManager();
    loaderManager.initLoader(0,null,this);
}

@NonNull
@Override
public Loader<List<UserBean>> onCreateLoader(int i, @Nullable Bundle bundle) {
    //傳回自定義Loader
    return new UserLoader(this);
}

@Override
public void onLoadFinished(@NonNull Loader<List<UserBean>> loader, List<UserBean> data) {

    users.addAll(data);
    mAdapter.notifyDataSetChanged();
}

@Override
public void onLoaderReset(@NonNull Loader<List<UserBean>> loader) {

}


class UserAdapter extends BaseAdapter{
    @Override
    public int getCount() {
        return users.size();
    }

    @Override
    public Object getItem(int position) {
        return users.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view=convertView;
        ViewHolder holder;

        if (view==null){
            view=LayoutInflater.from(CustomLoaderActivity.this).inflate(R.layout.user_item,null);
            holder=new ViewHolder();
            holder.usernameTv= view.findViewById(R.id.tv_username);
            holder.passwordTv=view.findViewById(R.id.tv_password);
            view.setTag(holder);
        }else {
            holder= (ViewHolder) view.getTag();
        }
        UserBean userBean= (UserBean) getItem(position);
        holder.usernameTv.setText(userBean.getUserName());
        holder.passwordTv.setText(userBean.getPassWord());
       return view;
    }
    class ViewHolder{
        TextView usernameTv;
        TextView passwordTv;
    }
}
           

}

//activity_custom_loader布局

<?xml version="1.0" encoding="utf-8"?>

<ListView
    android:id="@+id/custom_listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"></ListView>
           

//user_item布局

<?xml version="1.0" encoding="utf-8"?>

<TextView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="username"
    android:textSize="30sp"
    android:id="@+id/tv_username"/>

<TextView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="password"
    android:textSize="30sp"
    android:id="@+id/tv_password"/>