RecylerView不会更新新数据,除非通过打开和关闭模拟器来刷新它

问题描述 投票:0回答:1

Context:需要构建一个android应用程序(用于uni),该应用程序解析来自Rss feed的XML数据以获取交通数据。我正在获取数据没有问题。但是,我尝试实现一个微调器,而不是更改它时,它将从另一个API链接中获取新数据。数据被很好地捕获。

问题:除非我按模拟器设备(关闭/打开),否则不会更新视图。新数据将正确显示。

尝试的解决方案:我已经尝试使用mAdapter.notifyDataSetChanged();我不太确定我要去哪里。PS(对Java / Android Studio来说确实是新的)。 [任何建议,为什么我只能通过打开和关闭手机来刷新设备后才更新它。

Main Activity.java

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
private static final String TAG = "MainActivity";
private static final int ERROR_DIALOG_REQUEST =9001;
private RecyclerView mRecyclerView;
private ItemRecycleAdapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
private EditText search;
private String urlSource = "https://trafficscotland.org/rss/feeds/roadworks.aspx";
private HandleXml obj;
private ListView listView;
private Calendar cal = Calendar.getInstance();
private SimpleDateFormat sdf= new SimpleDateFormat("MMM-dd-yyyy");
private String current_date = sdf.format(cal.getTime());
private DatePicker datePicker;
private Button sbmt;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Spinner spinner = findViewById(R.id.feedType);
    search = (TextInputEditText)findViewById(R.id.inputDate);
    search.setText(current_date);
    mRecyclerView = findViewById(R.id.recView);
    obj = new HandleXml(this.urlSource);
    try {
        mAdapter = new ItemRecycleAdapter(obj.fetchXml());

    } catch (XmlPullParserException e) {
        e.printStackTrace();
    }
    mLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(mLayoutManager);
    mRecyclerView.setAdapter(mAdapter);

    BottomNavigationView bottomnav = findViewById(R.id.bottom_navigation);
    bottomnav.setOnNavigationItemSelectedListener(navListener);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.feedValues, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);

    spinner.setOnItemSelectedListener(this);

    if(isMapOK()){
        Log.i("fine", "MAP IS OKAY");
        init();
    }
}

ItemRecycleAdapter.java

public class ItemRecycleAdapter extends RecyclerView.Adapter<ItemRecycleAdapter.ItemRecyleHolder> implements Filterable {
private ArrayList<Item> mArrayList;
private ArrayList<Item> mArrayListCopy;

@Override
public Filter getFilter() {
    return itemFilter;
}

public static class ItemRecyleHolder extends RecyclerView.ViewHolder{
    public TextView title;
    public TextView desc;
    public TextView pubDate;

    public ItemRecyleHolder(@NonNull View itemView) {
        super(itemView);
        title =itemView.findViewById(R.id.title);
        desc =itemView.findViewById(R.id.desc);
        pubDate =itemView.findViewById(R.id.pubDate);
    }
}
public ItemRecycleAdapter(ArrayList<Item> itemList){
    this.mArrayList = itemList;
    this.mArrayListCopy =  itemList;
    notifyDataSetChanged();

}

public void set_data(ArrayList<Item>newList){
    if(mArrayList != null){
        mArrayList.clear();
        mArrayList = newList;
    }else{
        mArrayList = newList;
    }
   // notifyDataSetChanged();
}

public void updateData(ArrayList<Item> newList){
    this.mArrayList.clear();
    this.mArrayList = newList;
    //notifyDataSetChanged();

}

@NonNull
@Override
public ItemRecyleHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_view_layout, parent, false);
    ItemRecyleHolder irh = new ItemRecyleHolder(v);
    return irh;
}

@Override
public void onBindViewHolder(@NonNull ItemRecyleHolder holder, int position) {
    Item currentItem = mArrayList.get(position);
    holder.title.setText(currentItem.getTitle());
    holder.desc.setText(currentItem.getDescription());
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
    holder.pubDate.setText(sdf.format(currentItem.getPublishDate()));
}

@Override
public int getItemCount() {
    return mArrayList.size();
}

onItemSelected(在微调器中的MainActivity中使用一个选项进行测试)

 @Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    String text = parent.getItemAtPosition(position).toString();
    //this.urlSource = text;
    if(text.toLowerCase().equalsIgnoreCase("roadworks")){
        this.urlSource = "https://trafficscotland.org/rss/feeds/roadworks.aspx";
        //Log.i("Url", "Url changed" + this.urlSource);
    }else if(text.toLowerCase().equalsIgnoreCase("Planned Roadworks")){
        this.urlSource = "https://trafficscotland.org/rss/feeds/plannedroadworks.aspx";
        ArrayList<Item> newList = new ArrayList<>();
        try {
            obj = new HandleXml(this.urlSource);
            newList = obj.fetchXml();
            mAdapter.set_data(newList);
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }

    }else{
        this.urlSource = "https://trafficscotland.org/rss/feeds/currentincidents.aspx";
        Log.i("Url", "Url changed" + this.urlSource);
    }

}
java android android-recyclerview
1个回答
0
投票

在onItemSelected中尝试此

obj = new HandleXml(this.urlSource);
       mAdapter = null;
    try {
       mAdapter = new ItemRecycleAdapter(obj.fetchXml());
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    }
    if(mAdapter ! = null)
    mRecyclerview.setAdapter(mAdapter)
© www.soinside.com 2019 - 2024. All rights reserved.