【问题标题】:Android Custom ArrayAdapter Not Populating ListViewAndroid 自定义 ArrayAdapter 不填充 ListView
【发布时间】:2015-08-14 16:30:31
【问题描述】:

我正在开发一个 Android 应用程序,我需要在其中显示拉丁词汇单词的列表视图。我查看了许多教程和指南,并编写了自定义 ArrayAdapters 和模型,但列表视图中只有一项填充了我传递的值。以下是我认为相关的代码片段。

我使用 ViewHolder 模式的 ArrayAdapter

public class MyArrayAdapter extends ArrayAdapter<Vocab> {
    private int layout;
    public MyArrayAdapter(Context context, int resource, ArrayList<Vocab> objects) {
        super(context, resource, objects);
        layout = resource;
    }

    private static class ViewHolder {

        TextView dict_entry;
        TextView definition;
        Button add;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder mainViewHolder = null;
        Vocab word = getItem(position);
        if(convertView == null){
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(layout, parent, false);
            ViewHolder viewHolder = new ViewHolder();
            viewHolder.dict_entry = (TextView)convertView.findViewById(R.id.TVdict_entry);
            viewHolder.definition = (TextView)convertView.findViewById(R.id.TVdefinition);
            viewHolder.add = (Button)convertView.findViewById(R.id.Badd);
            viewHolder.add.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(getContext(), "Button was clicked for list item " + position, Toast.LENGTH_SHORT).show();
                }
            });
            convertView.setTag(viewHolder);
        } else {
            mainViewHolder = (ViewHolder)convertView.getTag();
            mainViewHolder.dict_entry.setText(word.dict_entry);
            mainViewHolder.definition.setText(word.definition);
        }

        return convertView;
    }
}

我的词汇模型

public class Vocab {
    public String dict_entry;
    public String definition;
    public String id;
    public Button add;

    public Vocab(JSONObject object){
        try {
            this.dict_entry = object.getString("dict_entry");
            this.definition = object.getString("definition");
            this.id = object.getString("id");
        } catch ( JSONException e){
            e.printStackTrace();
        }
    }

    public static ArrayList<Vocab> fromJSON(JSONArray jsonObjects){
        ArrayList<Vocab> words = new ArrayList<Vocab>();
        for(int i = 0; i < jsonObjects.length(); i++){
            try{
                words.add(new Vocab(jsonObjects.getJSONObject(i)));
            }catch (JSONException e){
                e.printStackTrace();
            }
        }
        return words;
    }
}

我获取 JSONArray 并将其传递给 Vocab 构造器然后尝试填充我的 LiveView 的代码

vocab_json = response;
            status.setText(response);

            try {
                JSONObject json = new JSONObject(response);
                JSONArray jsonArray = json.getJSONArray("all_words");
                ArrayList<Vocab> word_list = Vocab.fromJSON(jsonArray);

                ArrayList<Vocab> arrayOfVocab = new ArrayList<Vocab>();
                MyArrayAdapter adapter = new MyArrayAdapter(getBaseContext(), R.layout.vocab_list_item, arrayOfVocab);
                adapter.addAll(word_list);

                ListView listView = (ListView) findViewById(R.id.LVvocabwords);
                listView.setAdapter(adapter);
            }catch(JSONException e){
                e.printStackTrace();
            }

布局以防万一

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:descendantFocusability="beforeDescendants">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Dict_Entry"
        android:id="@+id/TVdict_entry"
        android:layout_alignBottom="@+id/Badd"
        android:layout_alignParentTop="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Definition"
        android:id="@+id/TVdefinition"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_alignBottom="@+id/Badd" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Add"
        android:id="@+id/Badd"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true" />
</RelativeLayout>

只有第一个元素改变了文本视图的默认文本。任何帮助将不胜感激,我相信这是我忽略的简单事情。

【问题讨论】:

  • Wat 的 word_list .count() ??
  • 按钮将从 ListView 项中获取焦点
  • 尝试记录这些值,看看你到底在哪里丢失了数据。
  • if else 语句外:viewHolder.add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getContext(), "Button was clicked for list item " + position, Toast.LENGTH_SHORT).show(); } }); mainViewHolder.dict_entry.setText(word.dict_entry); mainViewHolder.definition.setText(word.definition);

标签: android listview


【解决方案1】:

像这样改变你的适配器类。

public class MyArrayAdapter extends ArrayAdapter<Vocab> {
    private int layout;
    public MyArrayAdapter(Context context, int resource, ArrayList<Vocab> objects) {
        super(context, resource, objects);
        layout = resource;
    }

    private static class ViewHolder {

        TextView dict_entry;
        TextView definition;
        Button add;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        Vocab word = getItem(position);
        if(convertView == null){
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(layout, parent, false);
            viewHolder = new ViewHolder();
            viewHolder.dict_entry = (TextView)convertView.findViewById(R.id.TVdict_entry);
            viewHolder.definition = (TextView)convertView.findViewById(R.id.TVdefinition);
            viewHolder.add = (Button)convertView.findViewById(R.id.Badd);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder)convertView.getTag();
        }
         viewHolder.dict_entry.setText(word.dict_entry);
         viewHolder.definition.setText(word.definition);    

            viewHolder.add.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(getContext(), "Button was clicked for list item " + position, Toast.LENGTH_SHORT).show();
                }
            });

        return convertView;
    }
}

【讨论】:

  • 此代码无效viewHolder -> mainViewHolder 2 次convertedView.getTag()
  • 您是否遵守了代码或只是说它不起作用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多