【发布时间】: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);