Контекст: Необходимо создать приложение android (для универа), которое анализирует данные XML из фида Rss для данных трафика c. Я получаю данные без проблем. Но я пытался реализовать спиннер, а когда он изменился, он будет получать новые данные из другой ссылки API. Данные обрабатываются нормально.
Проблема: Представление не обновляется, пока я не нажму на устройство эмулятора (Выкл. / Вкл.), После чего новые данные будут отображены правильно.
Пробное решение : я пытался использовать mAdapter.notifyDataSetChanged (); и я не совсем уверен, где я иду не так. PS (действительно новый для Java / Android Studio). Любые предложения, почему его обновлять можно только после того, как я обновлю sh устройство либо включив, либо выключив телефон.
Основная активность. 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);
}
}