我正在使用SQLite数据库填充RecyclerView。我想让RecyclerView实时更新。但我失败了。我尝试过使用“notifyDataSetChanged()”但它不起作用。
你能不能也告诉我如何通过制作一个“新适配器”来刷新回收器视图。
哪个是更好的通知DataSetChanged();或任何其他?
这是我的回收水
package e.wolverine2.thewalkingapp;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {
Context context;
List<World> worldList = new ArrayList<>();
public RecyclerViewAdapter() {
//Default Constructor
}
public RecyclerViewAdapter(Context context, List<World> worldList) {
this.context = context;
this.worldList = worldList;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view;
view = LayoutInflater.from(context).inflate(R.layout.single_row, parent, false);
MyViewHolder viewHolder = new MyViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerViewAdapter.MyViewHolder holder, int position) {
holder.textView_Latitude.setText("Latitude : " + String.valueOf(worldList.get(position).getLatitiude()));
holder.textView_Longitude.setText("Longitude : " + String.valueOf(worldList.get(position).getLongitude()));
holder.textView_Time.setText("Time : " + worldList.get(position).getDate());
holder.textView_Location.setText("Location : \n" + "NEW LOCATION!");
}
@Override
public int getItemCount() {
return worldList.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
TextView textView_Latitude;
TextView textView_Longitude;
TextView textView_Time;
TextView textView_Location;
CardView cardView;
public MyViewHolder(View view) {
super(view);
textView_Latitude = (TextView) view.findViewById(R.id.textView_Latitude);
textView_Longitude = (TextView) view.findViewById(R.id.textView_Longitude);
textView_Time = (TextView) view.findViewById(R.id.textView_Time);
textView_Location = (TextView) view.findViewById(R.id.textView_Location);
cardView = (CardView) view.findViewById(R.id.cardView);
}
}
public void updateData(List<World> newWorldList) {
if (newWorldList != null && newWorldList.size() > 0) {
worldList.clear();
worldList.addAll(newWorldList);
new MainActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
Toast.makeText(context, "updateData Called!", Toast.LENGTH_SHORT).show();
}
});
}
}
}
**编辑:
adapter.update数据(列表);
在“locationChanged(double,double)”方法中调用。
主要活动。课程:**
public class MainActivity extends AppCompatActivity implements Tab1.OnFragmentInteractionListener, Tab2.OnFragmentInteractionListener, Tab3.OnFragmentInteractionListener {
DBHelper helper;
World world;
Location location;
GPSTracker tracker;
RecyclerViewAdapter adapter;
private Tab1 tab1;
public static final String BROADCAST_ACTION = "e.wolverine2.thewalkingapp";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 123);
MessageReciever reciever = new MessageReciever(new Message());
Intent intent = new Intent(this, MyService.class);
intent.putExtra("reciever", reciever);
startService(intent);
tracker = new GPSTracker(getApplicationContext());
location = tracker.getLocation();
helper = new DBHelper(getApplicationContext());
tab1 = new Tab1();
adapter = new RecyclerViewAdapter(getApplicationContext(), helper.getList());
final TabLayout tabLayout = (TabLayout) findViewById(R.id.myTabLayout);
tabLayout.addTab(tabLayout.newTab().setText("LOCATIONS"));
tabLayout.addTab(tabLayout.newTab().setText("TOTAL DISTANCE"));
tabLayout.addTab(tabLayout.newTab().setText("CALS"));
tabLayout.getTabAt(0).setIcon(R.drawable.ic_list);
tabLayout.getTabAt(1).setIcon(R.drawable.ic_person_pin);
tabLayout.getTabAt(2).setIcon(R.drawable.ic_fitness_excercise);
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
//onError();
final ViewPager viewPager = (ViewPager) findViewById(R.id.myViewPager);
final PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(pagerAdapter);
viewPager.setOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
try {
if (tab.getPosition() == 0) {
adapter.updateData(new DBHelper(getApplicationContext()).getList());
}
} catch (Exception e) {
Toast.makeText(MainActivity.this, "Main Activity " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
});
}
public void locationChanged(double longi, double lati) {
final Location location = new Location("");
location.setLatitude(lati);
location.setLongitude(longi);
world = new World();
String timeStamp = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(new Date());
world.setLongitude(location.getLongitude());
world.setLatitiude(location.getLatitude());
world.setDate(timeStamp);
world.setTime(timeStamp);
world.setLocation("Anonymous");
helper.addRow(world);
adapter.updateData(new DBHelper(getApplicationContext()).getList());
}
@Override
public void onFragmentInteraction(Uri uri) {
}
public class Message {
public void displayMessage(int resultCode, Bundle resultData) {
try {
double longi = resultData.getDouble("longitude");
double lati = resultData.getDouble("latitude");
locationChanged(longi, lati);
} catch (Exception e) {
Toast.makeText(MainActivity.this, "TOASTY X : " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}
public void onError() {
helper.onDropTable();
Toast.makeText(this, "TABLE DROPED!", Toast.LENGTH_SHORT).show();
}
}
@VoidMain,请查看下面的代码并尝试在您的代码上实现。
public void updateData(List<World> newWorldList) {
if(newWorldList == null || newWorldList.size() == 0)
return;
if(worldList != null && worldList.size() > 0)
data.clear();
worldList.addAll(newWorldList);
notifyDataSetChanged();
}
您实际上不需要创建MainActivity
的实例,就像这样
public void updateData(List<World> newWorldList) {
if (newWorldList != null && newWorldList.size() > 0) {
worldList.clear();
worldList.addAll(newWorldList);
notifyDataSetChanged();
}
}
它将使适配器刷新,但您需要从活动中调用此方法。对于这个类,你可以在其中设置适配器,你可以这样调用这个方法
adapter.updateData(list); //where adapter is the instance of your adapter and list is the new data list
编辑
我认为方法是工作的问题可能与数据集
这一行说明新列表必须包含0个以上的元素,如果不包含,则不会调用notifydatasetchanged的逻辑。请确保在debug中获得一个非空且包含元素的新列表
if (newWorldList != null && newWorldList.size() > 0)
我认为您只需要通知适配器worldList
已更改。
public void updateData(List<World> newWorldList) {
if (newWorldList != null && newWorldList.size() > 0) {
worldList.clear();
worldList.addAll(newWorldList);
notifyDataSetChanged();
}
}
您好,我目前正在使用Recyclerview ListAdapter,我想知道什么是等价的通知DataSetChanged或如何在添加值/记录后更新整个列表。? 我目前使用过此方法,但如果不刷新,则不会更新。 我想回到回收器视图。适配器和通知数据设置更改()。这样我的问题就解决了,你觉得怎么样?提前谢谢。
我试图允许刷卡以删除回收器视图中的项目,但由于某些原因,它并不总是玩得很好,显示的是空白而不是纸牌。 我已经制作了抛出和移动项目的代码句柄,以触发滑动动画,当滑动动画结束时,项目将从数据集中删除并通知适配器。 可能是因为我是RecyclerView新手,但是找不到缺少的东西。 我做了什么错在哪里?为什么它有时工作得很好,有时却不起作用? 有没有更好的解决方案来处理滑动到移除的处理?
我有回收站视图与数据,当它在底部与此代码它将加载新数据。我的问题是当它加载一个新的数据时,它将滚动回到顶部。我如何让它在同一个地方而不滚动? 我已经尝试在加载数据函数中安装了这个 但它仍然会向后滚动。请帮忙
当我按下后退按钮时,这个ShoppingActivity会被破坏,当我再次访问该activity时,我发现我的回收器视图项目被替换了两次。我该如何解决这个问题? ShoppingActivity.java这里编写的所有代码和volley类也在这里调用,当我按下后退键并再次访问该活动时,我发现我的回收器视图项被替换了 @override protected void onCreate(Bundle
我正在使用Recycler视图显示元素列表。当我们单击每一行时,每一行上都有一个按钮,状态改变,背景颜色改变。状态更新后,我将调用notifyDataSetChanged(),但recyclerView不会刷新。
我的应用程序中有一个Recolyer视图,我从用户那里获取值并将其存储在SQLite数据库中,然后这些值将通过检索显示在Recolyer视图中。问题是回收器视图只有在我重新打开我的活动时才更新,所以我如何在不重新打开活动的情况下刷新回收器视图,我应该使用UI线程吗?图像:插入项目后 在重新打开activty后,当用户单击insert按钮时,我想在recyclearview上显示插入的项目