- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Android 中遇到 Java 类
问题,我想为一些 Fragment
创建一个 PaginationAdapter>,在我这样尝试之前
SickFragmentToAll.java
adapter = new PaginationAdapterAll(getActivity(), fragment);
SickFragmentToCanceled
adapter = new PaginationAdapterCanceled(getActivity(), fragment);
PaginationAdapterAll
public PaginationAdapter(Context context, SickFragmentToAll fragment) {
this.context = context;
this.mCallback = (PaginationAdapterCallback) fragment;
results = new ArrayList<>();
}
PaginationAdapterCanceled
public PaginationAdapter(Context context, SickFragmentToCanceled fragment) {
this.context = context;
this.mCallback = (PaginationAdapterCallback) fragment;
results = new ArrayList<>();
}
这是可行的,但效率不高,因为每个 Fragment
都有 1 个不同的 PaginationAdapter。如何使PaginationAdapter动态工作?
让它看起来像这样
SickFragmentToAll
adapter = new PaginationAdapter(getActivity(), fragment);
SickFragmentToCanceled
adapter = new PaginationAdapter(getActivity(), fragment);
分页适配器**
public PaginationAdapter(Context context, Fragment fragment) {
this.context = context;
this.mCallback = (PaginationAdapterCallback) fragment; // The problem here, I want to make it dynamically
results = new ArrayList<>();
}
我尝试使用 Fragment fragment
但它不起作用
[更新] 完整代码
SickFragmentToAll.java
@SuppressWarnings("deprecation")
public class SickFragmentToAll extends Fragment implements PaginationAdapterCallback {
private static final String TAG = "FRAGMENT_ALL";
PaginationAdapter adapter;
LinearLayoutManager linearLayoutManager;
RecyclerView rv;
ProgressBar progressBar;
LinearLayout errorLayout;
Button btnRetry;
TextView txtError;
View RootView;
private static int PAGE_START = 1;
private boolean isLoading = false;
private boolean isLastPage = false;
private int TOTAL_PAGES = 2;
private int currentPage = PAGE_START;
private MovieService movieService;
private SickFragmentToAll fragment;
public SickFragmentToAll(){
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
RootView = inflater.inflate(R.layout.activity_main, container, false);
super.onCreate(savedInstanceState);
rv = (RecyclerView) RootView.findViewById(R.id.main_recycler);
progressBar = (ProgressBar) RootView.findViewById(R.id.main_progress);
errorLayout = (LinearLayout) RootView.findViewById(R.id.error_layout);
btnRetry = (Button) RootView.findViewById(R.id.error_btn_retry);
txtError = (TextView) RootView.findViewById(R.id.error_txt_cause);
adapter = new PaginationAdapter(getActivity(), fragment);
linearLayoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
rv.setLayoutManager(linearLayoutManager);
rv.setItemAnimator(new DefaultItemAnimator());
rv.setAdapter(adapter);
rv.addOnScrollListener(new PaginationScrollListener(linearLayoutManager) {
@Override
protected void loadMoreItems() {
isLoading = true;
currentPage += 1;
loadNextPage();
}
@Override
public int getTotalPageCount() {
return TOTAL_PAGES;
}
@Override
public boolean isLastPage() {
return isLastPage;
}
@Override
public boolean isLoading() {
return isLoading;
}
});
movieService = MovieApi.getClient().create(MovieService.class);
loadFirstPage();
btnRetry.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
loadFirstPage();
}
});
return RootView;
}
private void loadFirstPage() {
Log.d(TAG, "loadFirstPage: ");
// To ensure list is visible when retry button in error view is clicked
hideErrorView();
callRootApi().enqueue(new Callback<Root>() {
@Override
public void onResponse(Call<Root> call, Response<Root> response) {
// Got data. Send it to adapter
hideErrorView();
List<Result> results = fetchResults(response);
progressBar.setVisibility(View.GONE);
adapter.addAll(results);
if (currentPage <= TOTAL_PAGES)
adapter.addLoadingFooter();
else
isLastPage = true;
}
@Override
public void onFailure(Call<Root> call, Throwable t) {
t.printStackTrace();
showErrorView(t);
}
});
}
private List<Result> fetchResults(Response<Root> response) {
Root root = response.body();
return root.getResult();
}
private void loadNextPage() {
Log.d(TAG, "loadNextPage: " + currentPage);
callRootApi().enqueue(new Callback<Root>() {
@Override
public void onResponse(Call<Root> call, Response<Root> response) {
adapter.removeLoadingFooter();
isLoading = false;
List<Result> results = fetchResults(response);
adapter.addAll(results);
if (currentPage != TOTAL_PAGES)
adapter.addLoadingFooter();
else
isLastPage = true;
}
@Override
public void onFailure(Call<Root> call, Throwable t) {
t.printStackTrace();
adapter.showRetry(true, fetchErrorMessage(t));
}
});
}
private Call<Root> callRootApi() {
return movieService.getRoot(
"00.15.09.001",
"S",
1,
1,
currentPage
);
}
@Override
public void retryPageLoad() {
loadNextPage();
}
private void showErrorView(Throwable throwable) {
if (errorLayout.getVisibility() == View.GONE) {
errorLayout.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
txtError.setText(fetchErrorMessage(throwable));
}
}
private String fetchErrorMessage(Throwable throwable) {
String errorMsg = getResources().getString(R.string.error_msg_unknown);
if (!isNetworkConnected()) {
errorMsg = getResources().getString(R.string.error_msg_no_internet);
} else if (throwable instanceof TimeoutException) {
errorMsg = getResources().getString(R.string.error_msg_timeout);
}
return errorMsg;
}
private void hideErrorView() {
if (errorLayout.getVisibility() == View.VISIBLE) {
errorLayout.setVisibility(View.GONE);
progressBar.setVisibility(View.VISIBLE);
}
}
private boolean isNetworkConnected() {
ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo() != null;
}
}
PaginationAdapter.java
public class PaginationAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
/* -------------------------------- View Types -------------------------------- */
private static final int ITEM = 0;
private static final int LOADING = 1;
private static final String BASE_URL_IMG = "empty";
private PaginationAdapterCallback mCallback;
private boolean isLoadingAdded = false;
private boolean retryPageLoad = false;
private String errorMessage;
private List<Result> results;
private Context context;
public PaginationAdapter(Context context, SickFragmentToAll fragment) {
this.context = context;
this.mCallback = (PaginationAdapterCallback) fragment; // The problem here
results = new ArrayList<>();
}
public List<Result> getData() {
return results;
}
public void setData(List<Result> results) {
this.results = results;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.ViewHolder viewHolder = null;
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
switch (viewType) {
case ITEM:
View viewItem = inflater.inflate(R.layout.item_list, parent, false);
viewHolder = new MainItem(viewItem);
break;
case LOADING:
View viewLoading = inflater.inflate(R.layout.item_progress, parent, false);
viewHolder = new LoadingStatus(viewLoading);
break;
}
return viewHolder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
Result result = results.get(position); // Movie
switch (getItemViewType(position)) {
case ITEM:
final MainItem Item = (MainItem) holder;
Item.ReqNo.setText(result.getReqNo());
/* -------------------------------- Load Photo -------------------------------- */
loadImage(result.getPhoto())
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
// TODO: 08/11/16 handle failure
Item.proggressBar.setVisibility(View.GONE);
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
/* -------------------------------- Image ready, Hide Proggress Now -------------------------------- */
Item.proggressBar.setVisibility(View.GONE);
return false; // return false if you want Glide to handle everything else.
}
})
.into(Item.Photo);
break;
case LOADING:
LoadingStatus LoadingStatus = (LoadingStatus) holder;
if (retryPageLoad) {
LoadingStatus.errorLayout.setVisibility(View.VISIBLE);
LoadingStatus.proggressBar.setVisibility(View.GONE);
LoadingStatus.errorText.setText(
errorMessage != null ?
errorMessage :
context.getString(R.string.error_msg_unknown));
} else {
LoadingStatus.errorLayout.setVisibility(View.GONE);
LoadingStatus.proggressBar.setVisibility(View.VISIBLE);
}
break;
}
}
@Override
public int getItemCount() {
return results == null ? 0 : results.size();
}
@Override
public int getItemViewType(int position) {
return (position == results.size() - 1 && isLoadingAdded) ? LOADING : ITEM;
}
/* -------------------------------- Helpers - bind Views -------------------------------- */
private DrawableRequestBuilder<String> loadImage(@NonNull String posterPath) {
return Glide
.with(context)
.load(BASE_URL_IMG + posterPath)
.diskCacheStrategy(DiskCacheStrategy.ALL) // cache both original & resized image
.centerCrop()
.crossFade();
}
/* -------------------------------- Helpers - Pagination -------------------------------- */
public void add(Result r) {
results.add(r);
notifyItemInserted(results.size() - 1);
}
public void addAll(List<Result> moveResults) {
for (Result result : moveResults) {
add(result);
}
}
public void remove(Result r) {
int position = results.indexOf(r);
if (position > -1) {
results.remove(position);
notifyItemRemoved(position);
}
}
public void clear() {
isLoadingAdded = false;
while (getItemCount() > 0) {
remove(getItem(0));
}
}
public boolean isEmpty() {
return getItemCount() == 0;
}
public void addLoadingFooter() {
isLoadingAdded = true;
add(new Result());
}
public void removeLoadingFooter() {
isLoadingAdded = false;
int position = results.size() - 1;
Result result = getItem(position);
if (result != null) {
results.remove(position);
notifyItemRemoved(position);
}
}
public Result getItem(int position) {
return results.get(position);
}
/**
* Displays Pagination retry footer view along with appropriate errorMsg
*
* @param show
* @param errorMsg to display if page load fails
*/
public void showRetry(boolean show, @Nullable String errorMsg) {
retryPageLoad = show;
notifyItemChanged(results.size() - 1);
if (errorMsg != null) this.errorMessage = errorMsg;
}
/* -------------------------------- View Holders -------------------------------- */
protected class MainItem extends RecyclerView.ViewHolder {
private TextView ReqNo;
private TextView Method;
private TextView Name;
private TextView Branch;
private TextView Departement_Position;
private TextView Type;
private TextView Description;
private TextView Status;
private TextView Date;
private TextView LeaveGroup;
private TextView Flag;
private TextView Code_Status;
private ImageView Photo;
private ProgressBar proggressBar;
public MainItem(View itemView) {
super(itemView);
ReqNo = (TextView) itemView.findViewById(R.id.ReqNo);
Method = (TextView) itemView.findViewById(R.id.Method);
Name = (TextView) itemView.findViewById(R.id.Name);
Branch = (TextView) itemView.findViewById(R.id.Departement_Position);
Type = (TextView) itemView.findViewById(R.id.Type);
Description = (TextView) itemView.findViewById(R.id.Description);
Status = (TextView) itemView.findViewById(R.id.Status);
Date = (TextView) itemView.findViewById(R.id.Date);
LeaveGroup = (TextView) itemView.findViewById(R.id.LeaveGroup);
Flag = (TextView) itemView.findViewById(R.id.Flag);
Code_Status = (TextView) itemView.findViewById(R.id.Code_Status);
Photo = (ImageView) itemView.findViewById(R.id.movie_poster);
proggressBar = (ProgressBar) itemView.findViewById(R.id.movie_progress);
}
}
protected class LoadingStatus extends RecyclerView.ViewHolder implements View.OnClickListener {
private ProgressBar proggressBar;
private ImageButton retryButton;
private TextView errorText;
private LinearLayout errorLayout;
public LoadingStatus(View itemView) {
super(itemView);
proggressBar = (ProgressBar) itemView.findViewById(R.id.loadmore_progress);
retryButton = (ImageButton) itemView.findViewById(R.id.loadmore_retry);
errorText = (TextView) itemView.findViewById(R.id.loadmore_errortxt);
errorLayout = (LinearLayout) itemView.findViewById(R.id.loadmore_errorlayout);
errorText.setOnClickListener(this);
errorLayout.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.loadmore_retry:
case R.id.loadmore_errorlayout:
showRetry(false, null);
mCallback.retryPageLoad();
break;
}
}
}
}
我想让 PaginationAdapter
动态化,.知道如何到达它吗?
最佳答案
希望对您有所帮助。
假设 PaginationAdapterCallback
是这样的
public interface PaginationAdapterCallback{
void loadNextPage();
void retryPageLoad();
void loadFirstPage();
}
创建一个父类 SickFragment 实现 PaginationAdapterCallback
public abstract SickFragment implements PaginationAdapterCallback{
}
创建子类。
SickFragmentToCanceled extends SickFragment
SickFragmentToAll extends SickFragment
现在使用下面的构造函数创建PaginationAdapter
PaginationAdapter(Context context, SickFragment fragment)
您会找到所有需要的方法。
关于java - 如何动态创建类 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46338068/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!