android - 从 Retrofit 2.0 的 Async 获取数据

标签 android asynchronous retrofit2

我正在使用 retrofit 2.0 并且此代码是我的 fragment 和适配器的一部分。由于 asyn,我无法从该方法中获取值。值为 date、soup、maindinner、thirdkind、fourtkind、fifthkind。我想将它们添加到 mylistview 中。我怎样才能得到这个值。我想在 ListView 中显示它们。

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View view = inflater.inflate(R.layout.fragment_dining, container, false);

    rowItemDinings = new ArrayList<RowItemDining>();

    DiningInterface diningInterface = RetroClient.getClient().create(DiningInterface.class);
    Call<Dining[]> call = diningInterface.getJsonValues();
    call.enqueue(new Callback<Dining[]>()
    {
        @Override
        public void onResponse(Call<Dining[]> call, Response<Dining[]> response)
        {
            dinings = Arrays.asList(response.body());
            cacheVersion = dinings.get(0).cacheVersion;
            for(int i=0; i<dinings.size(); i++)
            {
                date.add(dinings.get(i).date);
                soup.add(dinings.get(i).soup);
                mainDinner.add(dinings.get(i).mainDinner);
                thirdKind.add(dinings.get(i).thirdKind);
                fourthKind.add(dinings.get(i).fourthKind);
                fifthKind.add(dinings.get(i).fifthKind);

                RowItemDining item = new RowItemDining(date.get(i),  soup.get(i),  mainDinner.get(i),  thirdKind.get(i),  fourthKind.get(i),  fifthKind.get(i));
                rowItemDinings.add(item);

            }
            //Toast.makeText(getActivity(), "This is my date! " + soup.get(0) + "" + soup.get(4)+ "" + soup.get(5) + soup.get(6)+ "" + soup.get(7), Toast.LENGTH_LONG).show();
        }
        @Override
        public void onFailure(Call<Dining[]> call, Throwable t)
        {
            Log.e(TAG, "Error: " + t.toString());
        }
    });

    mylistview = (ListView) getView().findViewById(R.id.dining_list);
    CustomAdapterDining adapter = new CustomAdapterDining(getActivity(), rowItemDinings);
    mylistview.setAdapter(adapter);

    return view;
}

CustomAdapterDining.java

public class CustomAdapterDining extends BaseAdapter

{
Context context;
List<RowItemDining> rowItemDinings;

List<RowItemDining> data;

public ListView mylistview;

public CustomAdapterDining( List<RowItemDining> rowItemDinings)
{
    this.rowItemDinings = rowItemDinings;
}

public CustomAdapterDining(Context context, List<RowItemDining> rowItemDinings)
{
    this.context = context;
    this.rowItemDinings = rowItemDinings;
}

@Override
public int getCount()
{
    return rowItemDinings.size();
}

@Override
public Object getItem(int position)
{
    return rowItemDinings.get(position);
}

@Override
public long getItemId(int position)
{
    return rowItemDinings.indexOf(getItem(position));
}

/* private view holder class */
private class ViewHolder
{
    TextView date;
    TextView soup;
    TextView mainDinner;
    TextView thirdKind;
    TextView fourthKind;
    TextView fifthKind;
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder = null;

LayoutInflater mInflater = (LayoutInflater) context
        .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
    convertView = mInflater.inflate(R.layout.list_row_dining, null);
    holder = new ViewHolder();

    holder.date = (TextView) convertView.findViewById(R.id.date);
    holder.soup = (TextView) convertView.findViewById(R.id.soup);
    holder.mainDinner = (TextView) convertView.findViewById(R.id.main_dinner);
    holder.thirdKind = (TextView) convertView.findViewById(R.id.third_kind);
    holder.fourthKind = (TextView) convertView.findViewById(R.id.fourth_kind);
    holder.fifthKind = (TextView) convertView.findViewById(R.id.fifth_kind);

    RowItemDining row_pos = rowItemDinings.get(position);

    holder.date.setText(row_pos.getDate());
    holder.soup.setText(row_pos.getSoup());
    holder.mainDinner.setText(row_pos.getMainDinner());
    holder.thirdKind.setText(row_pos.getThirdKind());
    holder.fourthKind.setText(row_pos.getFourthKind());
    holder.fifthKind.setText(row_pos.getFifthKind());

    convertView.setTag(holder);
}
else
{
    holder = (ViewHolder) convertView.getTag();
}

return convertView;

最佳答案

因为请求在后台进行并且响应将在适配器初始化之后进行,所以您需要在适配器中添加一个数据 setter 示例:

在适配器中

void setData(List<RowItemDining> data){
     this.data=data;
     notifyDataSetChanged();
}

在 fragment 中:

mylistview = (ListView) view.findViewById(R.id.dining_list);
CustomAdapterDining adapter = new CustomAdapterDining(getActivity(), rowItemDinings);
mylistview.setAdapter(adapter);

call.enqueue(new Callback<Dining[]>()
{

    @Override
    public void onResponse(Call<Dining[]> call, Response<Dining[]> response)
    {
        dinings = Arrays.asList(response.body());
        cacheVersion = dinings.get(0).cacheVersion;
        for(int i=0; i<dinings.size(); i++)
        {
          [...]
        }
     adapter.setData(rowItemDinings);
}

更新:添加适配器更改

@Override
public View getView(int position, View convertView, ViewGroup parent){
ViewHolder holder = null;

LayoutInflater mInflater = (LayoutInflater) context
        .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
    convertView = mInflater.inflate(R.layout.list_row_dining, null);
    holder = new ViewHolder();
    convertView.setTag(holder);
}
else
{
    holder = (ViewHolder) convertView.getTag();
}

    holder.date = (TextView) convertView.findViewById(R.id.date);
    holder.soup = (TextView) convertView.findViewById(R.id.soup);
    holder.mainDinner = (TextView) convertView.findViewById(R.id.main_dinner);
    holder.thirdKind = (TextView) convertView.findViewById(R.id.third_kind);
    holder.fourthKind = (TextView) convertView.findViewById(R.id.fourth_kind);
    holder.fifthKind = (TextView) convertView.findViewById(R.id.fifth_kind);

    RowItemDining row_pos = rowItemDinings.get(position);

    holder.date.setText(row_pos.getDate());
    holder.soup.setText(row_pos.getSoup());
    holder.mainDinner.setText(row_pos.getMainDinner());
    holder.thirdKind.setText(row_pos.getThirdKind());
    holder.fourthKind.setText(row_pos.getFourthKind());
    holder.fifthKind.setText(row_pos.getFifthKind());

return convertView;
}

关于android - 从 Retrofit 2.0 的 Async 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47744466/

相关文章:

javascript - 如何从异步调用返回响应?

javascript - 即使在异步加载资源后,Google Page Speed 仍然会出现渲染阻塞问题

android - 在Kotlin的自定义JsonDeserializer中使用默认的JsonDeserializer

Android 改造 - GET Json 数组

android - 如何异步调用rest api并等待所有调用在rx-android中完成

android - 如何检测 Android ListView 上的双击/点击?

android - 如何通过点击下载文件

node.js - Node NAN : getting set fault calling GetFromPersistent in Execute method of AsyncWorker

android - 如何在没有生根的情况下使用 USB On The Go 挂载 USB 驱动器?

Android:如何在指定时间开始一个 Activity ?