RecylerView не обновляет новые данные, если эмулятор не обновляется путем включения и выключения - PullRequest
0 голосов
/ 05 апреля 2020

Контекст: Необходимо создать приложение 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);
    }

}

1 Ответ

0 голосов
/ 05 апреля 2020

В 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...