当前位置: 首页 > 知识库问答 >
问题:

如何正确更新回收器视图?

夹谷和裕
2023-03-14

我正在使用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();
    }
}

共有3个答案

沈乐邦
2023-03-14

@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();
}
於意蕴
2023-03-14

您实际上不需要创建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)
黄弘深
2023-03-14

我认为您只需要通知适配器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上显示插入的项目