当我重新填充我的时候ListView,我会用我的方法调用一个特定的方法Adapter.
问题:
当我打电话updateReceiptsList给我时Adapter,数据会刷新,但我ListView没有反映这一变化.
问题:
ListView我打电话时为什么不显示新数据notifyDataSetChanged?
适配器:
public class ReceiptListAdapter extends BaseAdapter {
public List<Receipt> receiptlist;
private Context context;
private LayoutInflater inflater;
private DateHelpers dateH;
public ReceiptListAdapter(Activity activity, Context mcontext, List<Receipt> rl) {
context = mcontext;
receiptlist = rl;
Collections.reverse(receiptlist);
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
dateH = new DateHelpers();
}
@Override
public int getCount() {
try {
int size = receiptlist.size();
return size;
} catch(NullPointerException ex) { …Run Code Online (Sandbox Code Playgroud) 我的ListFragment代码
public class ItemFragment extends ListFragment {
private DatabaseHandler dbHelper;
private static final String TITLE = "Items";
private static final String LOG_TAG = "debugger";
private ItemAdapter adapter;
private List<Item> items;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.item_fragment_list, container, false);
return view;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.setHasOptionsMenu(true);
super.onCreate(savedInstanceState);
getActivity().setTitle(TITLE);
dbHelper = new DatabaseHandler(getActivity());
items = dbHelper.getItems();
adapter = new ItemAdapter(getActivity().getApplicationContext(), items);
this.setListAdapter(adapter);
}
@Override
public void onResume() {
super.onResume();
items.clear();
items …Run Code Online (Sandbox Code Playgroud) 我正在创建一个使用RecyclerView显示的卡片列表,其中每张卡片都有一个按钮,可以从列表中删除该卡片.
当我使用notifyItemRemoved()删除RecyclerView中的卡时,它会删除项目和动画,但列表中的数据未正确更新.
如果不是这样,我切换到notifyDataSetChanged()然后列表中的项目被删除并正确更新,但然后卡片不动画.
有人有使用notifyItemRemoved()的经验,并知道为什么它的行为与notifyDataSetChanged不同?
以下是我正在使用的一些代码:
private List<DetectedIssue> issues = new ArrayList<DetectedIssue>();
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
if(position >0){
RiskViewHolder riskHolder = (RiskViewHolder)holder;
final int index = position - 1;
final DetectedIssue anIssue = issues.get(index);
riskHolder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
int index = issues.indexOf(anIssue);
issues.remove(anIssue);
notifyItemRemoved(index);
//notifyDataSetChanged(); …Run Code Online (Sandbox Code Playgroud) android android-listview notifydatasetchanged android-recyclerview
我有一个FragmentPagerAdapter.它的getItem方法可以根据它从外部获得的数据返回一个片段.在我更新数据后,它假设显示我打电话notifyDataSetChanged但没有任何反应.我DID覆盖getItemPosition返回的方法POSITION_NONE:
public static class TabsAdapter extends FragmentPagerAdapter implements TabHost.OnTabChangeListener,
ViewPager.OnPageChangeListener
{
private final Context mContext;
private final TabHost mTabHost;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
private PagerTabsFragments fragmentDisplayInfo = null; // for now only a
// single size
// back
// stack
static class PagerTabsFragments
{
public int tabPosition;
public Fragment fragmentToDisplay;
public Object fragmentInfo;
public PagerTabsFragments(int tab, Fragment frag, Object info)
{
tabPosition = tab;
fragmentToDisplay …Run Code Online (Sandbox Code Playgroud) android android-adapter fragmentpageradapter notifydatasetchanged
我延长了
RecyclerView.Adapter<RecyclerView.ViewHolder>
Run Code Online (Sandbox Code Playgroud)
当我打电话的时候:
mRecyclerView.getAdapter().notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)
没啥事儿.
刷新视图的唯一方法是再次设置适配器(请参阅此答案):
mRecyclerView.setAdapter(new MyAdapter(...));
Run Code Online (Sandbox Code Playgroud)
这个解决方案有两个问题:
有任何想法吗?
android android-adapter notifydatasetchanged android-recyclerview
我正在尝试ListView使用下载任务列表创建一个.
下载任务在Service(DownloadService)中管理.每次接收到一大块数据时,任务通过a发送进度Broadcast,由Fragment包含ListView(SavedShowListFragment)的接收.收到Broadcast消息后,SavedShowListFragment将更新适配器和触发器中下载任务的进度notifyDataSetChanged().
列表中的每一行都包含a ProgressBar,a TextView表示正在下载的文件的标题,1表示进度的数值,a Button表示下载完成时暂停/恢复下载或播放保存的节目.
问题是暂停/恢复/播放Button通常没有响应(onClick()没有被调用),我认为这是因为整个列表都经常更新notifyDataSetChanged()(每次都有一大块数据,即收到1024字节,这可能是每秒多次,特别是当有多个下载任务正在运行时).
我想我可以在下载任务中增加数据块的大小,但我真的认为我的方法根本不是最优的!
可以经常打电话notifyDataSetChanged()让ListViewUI无响应吗?
有什么办法只更新一些Views的ListView行,即在我的情况ProgressBar和TextView与进步的数值,而不调用notifyDataSetChanged(),这将更新整个清单吗?
要更新下载任务的进度ListView,有没有比"getChunk/sendBroadcast/updateData/notifyDataSetChanged"更好的选项?
以下是我的代码的相关部分.
下载服务中的下载任务
public class DownloadService extends Service {
//...
private class DownloadTask extends AsyncTask<SavedShow, Void, Map<String, Object>> {
//...
@Override
protected Map<String, Object> doInBackground(SavedShow... params) {
//...
BufferedInputStream in = …Run Code Online (Sandbox Code Playgroud) 我想使用切换来在两个不同的视图之间切换,但使用相同的视图RecyclerView.基本上,一旦你切换,我想要RecyclerView适配器调用,onCreateViewHolder()但这次它将使用不同的布局项目文件.
是否notifydatasetchanged()导致适配器重建?或者还有另一种方式吗?
android android-adapter notifydatasetchanged android-recyclerview
目前,通过使用默认动画师android.support.v7.widget.DefaultItemAnimator,这是我在排序过程中遇到的结果
DefaultItemAnimator动画视频: https ://youtu.be/EccI7RUcdbg
public void sortAndNotifyDataSetChanged() {
int i0 = 0;
int i1 = models.size() - 1;
while (i0 < i1) {
DemoModel o0 = models.get(i0);
DemoModel o1 = models.get(i1);
models.set(i0, o1);
models.set(i1, o0);
i0++;
i1--;
//break;
}
// adapter is created via adapter = new RecyclerViewDemoAdapter(models, mRecyclerView, this);
adapter.notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)
但是,我更喜欢提供自定义动画,而不是排序时的默认动画(notifyDataSetChanged).旧物品将从右侧滑出,新物品将向上滑动.
预期的动画视频: https ://youtu.be/9aQTyM7K4B0
几年前,我通过使用LinearLayout+ 达到了这个效果View,因为那个时候我们还RecyclerView没有.
这就是动画的设置方式
PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 1.0f, 0f);
PropertyValuesHolder translationX = PropertyValuesHolder.ofFloat("translationX", …Run Code Online (Sandbox Code Playgroud) android android-animation notifydatasetchanged android-recyclerview
我RecyclerView用它实现了Custom Adapter如下
全球宣言如下
private LinearLayoutManager linearLayoutManager;
private int pastVisibleItems, visibleItemCount, totalItemCount;
private CustomRecyclerViewAdapter customRecyclerViewAdapter;
Run Code Online (Sandbox Code Playgroud)
首先,我在onCreate()方法内部创建了适配器实例,其中包含Empty Array并将其设置为recyclerView
linearLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearLayoutManager);
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(
Utility.ItemDecorationConst);
recyclerView.addItemDecoration(dividerItemDecoration);
customRecyclerViewAdapter = new CustomRecyclerViewAdapter(getActivity());
recyclerView.setAdapter(customRecyclerViewAdapter);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
visibleItemCount = linearLayoutManager.getChildCount();
totalItemCount = linearLayoutManager.getItemCount();
pastVisibleItems = linearLayoutManager.findFirstVisibleItemPosition();
if (loading) {
if ((visibleItemCount + pastVisibleItems) >= totalItemCount) {
loading = false;
customRecyclerViewAdapter.addProgressBarEntry();
controller.getNextPage(PublisherAppContainerFragment.this);
}
} …Run Code Online (Sandbox Code Playgroud) android observers notifydatasetchanged recycler-adapter android-recyclerview