- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道这可能是一个愚蠢的问题,但我找不到答案。我请求你的帮助。
我有一个使用 LinearLayoutManager 的 RecyclerView 和一个自定义 RecyclerView.Adapter。
我的数据类:
public class Img extends ArrayList<Img> {
int id = 0;
String filepath = "";
boolean checked = false;
int progress = 0;
... getters and setters...
}
Activity 代码:
File folder = new File("My path");
File[] files = folder.listFiles();
int id = 0;
for (File file : files) {
if (!file.isDirectory()) {
Img img = new Img();
img.setId(id);
img.setFilepath(file.toString());
imgs.add(img);
++id;
}
}
mAdapter = new GalleryAdapter(getApplicationContext(), imgs);
RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getApplicationContext(), 2);
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
和适配器:
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
Img item = imgs.get(position);
holder.txt.setText(String.valueOf(item.getProgress()));
holder.thumbnail.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
File source = new File(imgs.get(position).getFilepath());
String strFileName = source.getName();
File destination = new File("My path" + "/" + strFileName);
try {
InputStream input = null;
OutputStream output = null;
long lenghtOfFile = source.length();
int count;
try {
input = new FileInputStream(source);
output = new FileOutputStream(destination);
byte[] data = new byte[1024];
long total = 0;
int xc2 = 0;
while ((count = input.read(data)) != -1) {
total += count;
int xc = (int) ((total * 100) / lenghtOfFile);
output.write(data, 0, count);
imgs.get(position).setProgress(xc);
notifyItemChanged(position);
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} finally {
output.flush();
output.close();
input.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
为什么notifyItemChanged(position)只有在操作完成并提交给TextView(txt)的值只有100时才会触发?
更新:此代码不起作用
@Override
public MyViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
final View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.gallery_thumbnail, parent, false);
final MyViewHolder holder = new MyViewHolder(itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final int position = holder.getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
File source = new File(imgs.get(position).getFilepath());
String strFileName = source.getName();
File destination = new File("My path" + "/" + strFileName);
try {
InputStream input = null;
OutputStream output = null;
long lenghtOfFile = source.length();
int count;
try {
input = new FileInputStream(source);
output = new FileOutputStream(destination);
byte[] data = new byte[1024];
long total = 0;
int xc2 = 0;
while ((count = input.read(data)) != -1) {
total += count;
int xc = (int) ((total * 100) / lenghtOfFile);
output.write(data, 0, count);
if (xc2!=xc){
//holder.progress_bar.setProgress(xc);
imgs.get(position).setProgress(xc);
notifyItemChanged(position);
try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
xc2 = xc;
}
} finally {
output.flush();
output.close();
input.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
return holder;
}
UPD2:此代码不起作用
@Override
public MyViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.gallery_thumbnail, parent, false);
final MyViewHolder holder = new MyViewHolder(itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final int position = holder.getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
for (int i=1; i<=100; ++i) {
imgs.get(position).setProgress(i);
notifyItemChanged(position);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
});
//return new MyViewHolder(itemView);
return holder;
}
最佳答案
基本上,您在 UI 线程上加载文件,因此每次调用 notifyItemChanged() 时,您都会向 Looper 添加一个任务,但 Looper 仅在您完成加载后才开始执行该任务,因此您只会看到第 100 个。
我会像这样在不同的线程上运行负载:
new View.OnClickListener() {
@Override
public void onClick(View view) {
File source = new File(imgs.get(position).getFilepath());
String strFileName = source.getName();
File destination = new File("My path" + "/" + strFileName);
**> Thread t1 = new Thread(new Runnable(){
public void run(){ <**
try {
InputStream input = null;
OutputStream output = null;
long lenghtOfFile = source.length();
int count;
try {
input = new FileInputStream(source);
output = new FileOutputStream(destination);
byte[] data = new byte[1024];
long total = 0;
int xc2 = 0;
while ((count = input.read(data)) != -1) {
total += count;
int xc = (int) ((total * 100) / lenghtOfFile);
output.write(data, 0, count);
imgs.get(position).setProgress(xc);
notifyItemChanged(position);
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} finally {
output.flush();
output.close();
input.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
t1.start();
}
}
这是我的猜测,祝你好运!
关于android - 为什么 notifyItemChanged 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41156569/
我知道这可能是一个愚蠢的问题,但我找不到答案。我请求你的帮助。 我有一个使用 LinearLayoutManager 的 RecyclerView 和一个自定义 RecyclerView.Adapte
我正在使用后台服务下载一些文件并更新 RecyclerView 中的进度。当进度更改时,服务将使用回调到 Activity ,其中项目随进度更改。我想知道哪一个在性能方面更好? 所以我必须像这样使用
我有一个 ImageView,其中使用 Glide 加载图像。当我执行了 like 操作后,使用 notifyItemChanged(position) 通知回收器 View 适配器。它会导致图像闪烁
当我在我的 RecyclerView 上调用 notifyItemChanged() 时,相应的 Views(在本例中为按钮)没有按预期更新.我调用他们的原因是数据已经改变,这会导致他们的背景颜色改变
首先,我为此工作了一整天,但一事无成。我有一个 RecyclerView 和一个使用 RecyclerView 的 SortedList 的适配器。我尝试使用回调类实现 TouchHelper: pu
为了在我从详细信息 Activity 返回时从最后选择的 RecyclerView 项目中删除突出显示的背景颜色,我在 onResume() 中尝试了这个: mAdapter.notifyItemCh
RecyclerView 调用 notifyItemChanged() 导致空白条目 我有一个 RecyclerView 并且它的每个子项都有一个 RecyclerView,当子项中的 Recycle
根据documentation在 RecyclerView.Adapter 中,您可以通知某个项目已更改并传入一个“可选负载对象”,该对象随后将被合并并传递给 onBindViewHolder允许更精
我有一个带有显示服务器列表的适配器的 RecycleView并且用户必须选择一个服务器。 当我在 onClick() 方法中调用 notifyItemChanged(previousPosition)
我有一个数据集,它可能会在刷新时发生变化。很难确定现有数据集中的哪些条目已更改。我通读了 recyclerview 适配器说明,我的主要问题是。 确定更改了哪个数据 View ,然后对受影响的范围使用
我有一个使用 LinearLayoutManager 的 RecyclerView 和一个自定义 RecyclerView.Adapter。当用户长按某个项目时,它会触发仅该项目的异步网络刷新。我知道
我正在将 ViewPager2 与 FragmentStateAdapter 一起使用,并且我正在调用 notifyItemChanged(position)。但正如预期的那样,createFragm
编辑 我在 Github 上创建了一个演示项目来展示确切的问题。 Git Project . 我在 Kotlin 中编写了一个可扩展的 recyclerView 每行都有一个使用 TextToSpee
如题。我正在编写一个支持多选模式的自定义 RecyclerView。我需要跟踪每个项目的选中/未选中状态。所以在 recyclerView 的数据大小发生变化之后。我想更新我的跟踪状态列表的大小。但我
我的代码如下所示: public class PopularItemsAdapter extends RecyclerView.Adapter implements MyCartLis
我在 AdapterActivity 中有一个 RecyclerView。单击其任何项目后,我使用 AlertDialogShow#UpdateStudent() 方法更新该项目。我的问题是我无法使用
有什么方法可以在项目更改时从回收 View 中禁用 CardView 提升动画,但保留原始阴影和项目动画师? 我试图禁用 CardView 状态动画器 android:stateListAnimato
所以我有一个 Activity RecyclerView我想改变TextView RecyclerView 中的每一项通过按下具有 onClickListener() 的按钮在 Activity 中。
我正在尝试更新 ViewHolder 中的 RecyclerView 而不重新绑定(bind)整个内容。根据文档,我应该通过调用 RecyclerView.Adapter.notifyItemChan
所以我有一个 RecyclerView,在我拉入其中的每个 xml 中都有一个复选框,当按下该复选框时,该复选框会从 RecyclerView 中删除该特定项目。至少那是我试图做的。据我了解,要使其正
我是一名优秀的程序员,十分优秀!