notifyDataSetChanged внутри лямбды, которая реализует FastAndroidNetwork - PullRequest
2 голосов
/ 05 апреля 2019

Я посмотрел на некоторые ответы, но ничто не похоже на то, что это может решить эту проблему.

Я пытаюсь сделать словарь, который показывает определения внутри cardView. У меня есть RelativeLayout, который содержит linearLayout (с панелью поиска и кнопкой) и recyclerView.

Я управляю этим в классе Activity под названием Dictionnary.java

Некий код:

public class Dictionnary extends AppCompatActivity {
String URL = "https://jisho.org/api/v1/search/words";

RecyclerView recyclerView;
DicoAdapter dicoAdapter;
Button search;
EditText wordToSearch;
List<WordDico> resultSearch;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dictionnary);
    AndroidNetworking.initialize(getApplicationContext());
    search = findViewById(R.id.searchbutton);
    wordToSearch = findViewById(R.id.wordToSearch);

    recyclerView = findViewById(R.id.dicoview);
    resultSearch = new ArrayList<>();
    dicoAdapter = new DicoAdapter(getApplicationContext(), resultSearch);
    recyclerView.setAdapter(dicoAdapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));

    search.setOnClickListener(event ->{
        if(wordToSearch.getText().toString() != null && wordToSearch.getText().toString().equals("")){
            // todo
            // handle error
        }else {
            Log.d("word sent", wordToSearch.getText().toString());

            AndroidNetworking.get(URL).
                    setPriority(Priority.LOW).addQueryParameter("keyword", wordToSearch.getText().toString()).
                    build().getAsJSONObject(new JSONObjectRequestListener(){
                @Override
                public void onResponse(JSONObject response) {
                    if (response != null) {
                        //build the list
                        Log.d("Request returned", response.toString());
                        Moshi moshi = new Moshi.Builder().build();
                        Type listMyData = Types.newParameterizedType(List.class, WordDico.class);
                        JsonAdapter<List<WordDico>> adapter = moshi.adapter(listMyData);
                        try {
                            resultSearch = adapter.fromJson(response.getJSONArray("data").toString());
                            dicoAdapter.notifyDataSetChanged();
                            Log.d("Ma liste: ", "" + resultSearch.size());
                        } catch (IOException e) {
                            e.printStackTrace();
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    } else {
                        //handle the error
                    }
                }

                @Override
                public void onError(ANError anError) {
                    //handle error in the networking
                    Log.d("Error request", "error code: " + anError.getErrorBody() +"  " +anError.getErrorDetail());
                }
            });
        }
    });
}

}

Поэтому я уведомляю, что набор данных изменился, но ничего не происходит. Это первый раз, когда я пытаюсь поместить RecyclerView в уже запущенное действие.

Вот макет словаря:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/menu_bg"
tools:context=".Dictionnary">

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/search"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:paddingTop="50dp">
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/l_s_dic"
    android:fontFamily="@font/font"/>
<EditText
    android:id="@+id/wordToSearch"
    android:layout_width="190dp"
    android:layout_height="wrap_content"/>
<Button
    android:id="@+id/searchbutton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/b_s_dic"/>
</LinearLayout>

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/dicoview"
    android:layout_below="@+id/search">

</android.support.v7.widget.RecyclerView>

Может кто-нибудь объяснить логику использования recyclerView и как решить эту проблему?

1 Ответ

1 голос
/ 05 апреля 2019

См. этот ответ и прочитайте данное объяснение для Замените старый список новым списком .Вместо того, чтобы перезаписывать объект ListS resultSearch, установленный для адаптера с объектом, созданным из адаптера json, вы должны создать новый список для ответа JSON, очистить старый список и добавить новый список в старый список.Затем вызовите notifyDataSetChanged ().Надеюсь, это поможет.

...