【问题标题】:Populate Custom List View in Fragment from API从 API 填充片段中的自定义列表视图
【发布时间】:2015-03-10 20:33:45
【问题描述】:

我想使用来自 TED API 的 Ted Talks 填充自定义列表视图,但没有显示任何内容。我已经做了所有的努力,但什么也没做。 这是我的代码 片段类

public class TalksFragment extends ListFragment {

private ListView talkList;
private String TalkUrl = "https://api.ted.com/v1/talks.json?api-key=nm4nq9uyqg558m7z8axbu3be&order=created_at:desc&fields=media_profile_uris,photo_urls,speakers&offset=";
private HandleJSON obj;
private ProgressDialog m_ProgressDialog = null;
private ArrayList<TalksItems> TalkItemsArray = null;
private TalkListAdapter talkListAdapter;
private Runnable viewOrders;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View talks = inflater.inflate(R.layout.talk_list_frag, container, false);
    talkList = (ListView) talks.findViewById(android.R.id.list);
    return talks;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    TalkItemsArray = new ArrayList<>();
    this.talkListAdapter = new TalkListAdapter(getActivity(), android.R.layout.simple_list_item_1, TalkItemsArray);
    talkList.setAdapter(this.talkListAdapter);

    viewOrders = new Runnable(){
        @Override
        public void run() {
            int Offset=0;
            obj = new HandleJSON(TalkUrl + Offset);
            obj.fetchJSON("Talks");
            while (obj.parsingComplete);
            TalkItemsArray = obj.getTalkItems();
            getActivity().runOnUiThread(returnRes);
        }
    };
    Thread thread =  new Thread(null, viewOrders, "MagentoBackground");
    thread.start();
    m_ProgressDialog = ProgressDialog.show(getActivity(),
            "Please wait...", "Retrieving data ...", true);


}

private Runnable returnRes = new Runnable() {

    @Override
    public void run() {
        int size = TalkItemsArray.size();
        if(TalkItemsArray != null && TalkItemsArray.size() > 0){
            talkListAdapter.notifyDataSetChanged();
            for(int i=0; i<size; i++)
                talkListAdapter.add(TalkItemsArray.get(i));
        }
        m_ProgressDialog.dismiss();
        talkListAdapter.notifyDataSetChanged();
    }
};



private class TalkListAdapter extends  ArrayAdapter<TalksItems>{
    LayoutInflater inflater;
    private ArrayList<TalksItems> items;
    public TalkListAdapter(Context context, int textViewResourceId, ArrayList<TalksItems> items) {
        super(context, textViewResourceId, items);
        inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.items = items;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;
        if(convertView ==  null)
            view = inflater.inflate(R.layout.custom_list_talk, null);
        else
            view = convertView;

        TalksItems TI = items.get(position);
        if(TI != null){
            TextView talkName = (TextView)view.findViewById(R.id.txtTalkName);
            TextView speakerName = (TextView)view.findViewById(R.id.txtSpeakerName);
            TextView talkDescription = (TextView)view.findViewById(R.id.txtTalkDescription);
            ImageView talkImage = (ImageView)view.findViewById(R.id.talkImage);

            talkName.setText(TI.getTalkName());
            speakerName.setText(TI.getSpeakerName());
            talkDescription.setText(TI.getTalkDescription());
            talkImage.setImageURI(TI.getImageURL());
        }
        return view;
    }
}

} 其中 custom_list_talk 是自定义列表的布局,talk_list_frag 是具有 ID 为“@android:id/list”的列表视图的片段的布局 API 工作正常,数据来自 API 正确。 问题是它在自定义列表视图中什么都不显示(或者它可能没有膨胀等)

编辑 愚蠢的错误。我没有调用 getMethod。

【问题讨论】:

  • 1.是 TI != null 吗? 2、你的适配器的getCount方法在哪里?您是否确认它返回 > 0?
  • 1.是 2. 我没有检查适配器,但只检查了 API 中的数据。如何检查适配器是否返回?
  • 这个问题代表我错了一半,你不需要自己实现getCount,但你可以做adapter.getCount来检查它是否真的有项目。另外,发布您的 xml 文件。
  • 哦,是的。太感谢了。我提出的非常愚蠢的问题。在您的指导下,我能够解决它,谢谢您
  • 很高兴听到。您可能希望使用您找到的解决方案来编辑​​您的问题,这可能对其他人有帮助。

标签: android listview android-fragments android-custom-view


【解决方案1】:

根据您使用的代码

obj = new HandleJSON(TalkUrl + Offset);
            obj.fetchJSON("Talks");

应该是

obj = new HandleJSON(TalkUrl + Offset);
            obj.fetchJSON("talks");//Note the case of KEY

JSON 区分大小写。

**Edit:**

确保您没有填充

TalkItemsArray

在您的代码中。

【讨论】:

  • 我其实是在调用 fetchJSON 来调用 API 进行会谈fetchJSON(string fetchWhat) { //code if(fetchWhat == "Talks") ReadAndParseTalk(data); }
  • 确保您从 api 调用中获取 json 数据。
  • 代码太长无法粘贴到这里,但我已经确保了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多