Как получить список данные используя web api asp net core и вывести их в listview android

Опыт в использование web api и retrofit у меня небольшой, поэтому строго не судити.

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

Web API:

Get запрос в контроллере:

[HttpGet]

public List<Friendlist> GetFriendAll(string friendname)
        {            
            List<Friendlist> list = _context.Friendlists.Where(friendlist => friendlist.Username == friendname).ToList();
            return list;
        }

Класс полей данных БД:

public partial class Friendlist
    {
        public int Id { get; set; }
        public string Friendname { get; set; }
        public string Username { get; set; }
    }

Context:

 public partial class CopyContext : DbContext
        {
            public SpotyCopyContext()
            {
            }

        public SpotyCopyContext(DbContextOptions<SpotyCopyContext> options)
            : base(options)
        {
        }    
       
        public virtual DbSet<Friendlist> Friendlists { get; set; }            

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlServer("link to the db");
            }
        }
protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.HasAnnotation("Relational:Collation", "Cyrillic_General_CI_AS");          

            modelBuilder.Entity<Friendlist>(entity =>
            {
                entity.ToTable("Friendlist");

                entity.Property(e => e.Id).HasColumnName("id");

                entity.Property(e => e.Friendname)
                    .HasMaxLength(150)
                    .HasColumnName("friendname");

                entity.Property(e => e.Username)
                    .HasMaxLength(150)
                    .HasColumnName("username");
            });
 OnModelCreatingPartial(modelBuilder);
        }

        partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
    }
}

Android studio:

FriendList класс, объекты которого будут возвращаться с API:

   package com.example.myapplication.API.Objects;

public class FriendList
{
    int Id;
    public String Friendname;
    public String Username;
    public FriendList(String _Friendname,String _Username)
    {
        this.Friendname=_Friendname;
        this.Username=_Username;
    }
    public String getName() {
        return this.Friendname;
    }
}

AllFriendListGetCallback интерфейс, который будет возвращать результат обращения к API:

public interface AllFriendListGetCallback
{
    void onResult(List<FriendList> friendLists);
    void onError(Throwable e);
}

IAPI интерфейс, который определяет метод, который реализован на стороне API:

@GET("api/friendlist2")
    Call<List<FriendList>> GetFriendAll(@Query("friendname")String friendname);

MainApi - главный класс, который настраивает подключение к API:

public class MainAPI
{
public static void GetFriendAll(String friendname, AllFriendListGetCallback allFriendListGetCallback) {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())      
                .build();
        IAPI api = retrofit.create(IAPI.class);
        api.GetFriendAll2(friendname).enqueue(new retrofit2.Callback<List<FriendList>>() {
            @Override
            public void onResponse(Call<List<FriendList>> call, Response<List<FriendList>> response) {
                allFriendListGetCallback.onResult(response.body());
            }

            @Override
            public void onFailure(Call<List<FriendList>> call, Throwable t) {
                allFriendListGetCallback.onError(t);
            }
        });
    }
}

Activity, где находится Listview:

<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context=".look_people"
    android:background="@drawable/a1">
 <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button10_2"
        android:visibility="visible"
        android:layout_above="@+id/bottomnavigation"
        android:layout_marginBottom="5dp"/>
</RelativeLayout>

Код acvtivity(это примерный код):

public class look_people extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener
{   
    ListView listView;
  
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_look_people);        
        listView=findViewById(R.id.listview);        
   
        Upload_listview();
        AdapterView.OnItemClickListener itemListener = new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

                // получаем выбранный пункт
                FriendList selectedFriendName = (FriendList) parent.getItemAtPosition(position);
                Toast.makeText(getApplicationContext(), "Был выбран пункт " + selectedFriendName.getName(),
                        Toast.LENGTH_SHORT).show();
            }
        };
        listView2.setOnItemClickListener(itemListener);            
    }
    public void Upload_listview() {      
                MainAPI.GetFriendAll(Myname, new AllFriendListGetCallback() {
                    @Override
                    public void onResult(List<FriendList> friendLists)
                    {
                        if(friendLists!=null)
                        {
                            FriendListAdapter friendListAdapter = new FriendListAdapter(look_people.this, R.layout.activity_list_friends, friendLists);
                            listView.setAdapter(friendListAdapter);
                        }
                        else
                        {

                        }
                    }
                    @Override
                    public void onError(Throwable e)
                    {
                        Log.e("error here 1 : ",e.getMessage());
                    }
                });      
    }
}

Adapter:

public class FriendListAdapter extends ArrayAdapter<FriendList> {

private LayoutInflater inflater;
private int layout;
private List<FriendList> friendLists;

public FriendListAdapter(Context context, int resource, List<FriendList> friendLists) {
        super(context, resource, friendLists);
        this.friendLists = friendLists;
        this.layout = resource;
        this.inflater = LayoutInflater.from(context);
        }
public View getView(int position, View convertView, ViewGroup parent) {

        View view=inflater.inflate(this.layout, parent, false);
        TextView friendname = view.findViewById(R.id.textViewFriend);//R.id.textViewFriend находится на отдельном activity, где только этот textview
        FriendList friendList = friendLists.get(position);
        friendname.setText(friendList.getName());

        return view;
        }
}

Пожалуйста, помогите с решением. Спасибо всем за ответы.

Дополнение:

Программа запускается, но когда происходит переход на данную страницу, то в Listview отрисовывается две строки(потому что в бд есть только две подходящие записи) и эти строки пустые и если нажать на любую из строк, то выведет содержимое null.

Если сделать запрос localhost:5001/api/friendlist2?myname=jj через браузер, то вид ответа будет такой:

[{"id":1014,"friendname":"2","username":"jj"},{"id":2022,"friendname":"ai","username":"jj"}]


Ответы (1 шт):

Автор решения: JohnBeacker

Я решил данную проблему.

Решил изменить GET-запрос на сервере(можно остановить, как я писал выше с помощью List):

public IEnumerable<Friendlist> GetFriendAll(string friendname)
        {            
            IEnumerable<Friendlist> list = _context.Friendlists.Where(friendlist => friendlist.Username == friendname);
            return list;
        }

И поменял названия в FriendList класс, объекты которого будут возвращаться с API(будьте внимательны в названиях, из-за заглавных букв в имене, у меня была ошибка):

public class FriendList
{
    int id;
    public String friendname;
    public String username;
    public FriendList(String _friendname,String _username)
    {
        this.friendname=_friendname;
        this.username=_username;
    }
    public String getName() {
        return this.friendname;
    }
}

Остальной код полностью рабочий.

→ Ссылка