Как получить список данные используя 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 шт):
Я решил данную проблему.
Решил изменить 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;
}
}
Остальной код полностью рабочий.