如何在 ListView 的每个项目中都有一个 AutoCompleteTextView
How to have a AutoCompleteTextView in each item of a ListView
我已经尝试这样做了一段时间,但似乎做不到。我将适配器应用于对象,但是当我在视图中输入字符时,仍然没有出现。
public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder;
if (view == null) {
holder = new ViewHolder();
view = mInflater.inflate(R.layout.list_item, parent, false);
holder.nameTxt = (AutoCompleteTextView) view.findViewById(R.id.name_txt);
String[] drinkArray = activity.getResources().getStringArray(R.array.drink_array);
holder.adapter = new ArrayAdapter<>(activity, android.R.layout.simple_list_item_1, drinkArray);
holder.nameTxt.setAdapter(holder.adapter);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
if (!itemExists(position)) return view;
ListItem item = getItem(position);
holder.nameTxt.setText(item.name);
holder.nameTxt.setAdapter(holder.adapter);
holder.nameTxt.setTag(position);
holder.nameTxt.setOnFocusChangeListener(this);
return view;
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) return;
int position;
ListItem item;
switch (v.getId()) {
case R.id.name_txt:
position = (int) v.getTag();
if (!itemExists(position)) return;
item = getItem(position);
AutoCompleteTextView txtView = (AutoCompleteTextView) v;
item.name = txtView.getText().toString();
break;
default:
Log.e(TAG, "Unknown onFocusChange View ID: " + v.getId());
break;
}
}
public class ViewHolder {
public AutoCompleteTextView nameTxt;
public ArrayAdapter<String> adapter;
}
public class ListItem {
public String name;
public ListItem() {
name = "";
}
}
好的,上面这段代码是我到目前为止的代码,它可以完美地保存和加载来自文本视图的数据。
我认为您的方法 getView else 有误。你可以尝试以下
变化
holder=(viewHolder) View.getTag();
来自
holder = view;
然后出这个类型else
ViewHolder item = (ViewHolder) holder.getTag();
...
我找到了完成这个任务的方法。我在 ListView (ListView1) 中放置了一个普通的 TextView,然后在 ListView1 之上创建了另一个 ListView (ListView2)。然后根据用户在 ListView1 中单击的项目,我将用户单击的 TextViewer 中的项目编号(位置)和文本传递给 ListView2,它可以在其中设置自身的上边距并过滤其结果。设置上边距会将其移动到用户单击的 TextView 下方。如果有人想要代码,请发表评论并更新答案。
我已经尝试这样做了一段时间,但似乎做不到。我将适配器应用于对象,但是当我在视图中输入字符时,仍然没有出现。
public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder;
if (view == null) {
holder = new ViewHolder();
view = mInflater.inflate(R.layout.list_item, parent, false);
holder.nameTxt = (AutoCompleteTextView) view.findViewById(R.id.name_txt);
String[] drinkArray = activity.getResources().getStringArray(R.array.drink_array);
holder.adapter = new ArrayAdapter<>(activity, android.R.layout.simple_list_item_1, drinkArray);
holder.nameTxt.setAdapter(holder.adapter);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
if (!itemExists(position)) return view;
ListItem item = getItem(position);
holder.nameTxt.setText(item.name);
holder.nameTxt.setAdapter(holder.adapter);
holder.nameTxt.setTag(position);
holder.nameTxt.setOnFocusChangeListener(this);
return view;
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) return;
int position;
ListItem item;
switch (v.getId()) {
case R.id.name_txt:
position = (int) v.getTag();
if (!itemExists(position)) return;
item = getItem(position);
AutoCompleteTextView txtView = (AutoCompleteTextView) v;
item.name = txtView.getText().toString();
break;
default:
Log.e(TAG, "Unknown onFocusChange View ID: " + v.getId());
break;
}
}
public class ViewHolder {
public AutoCompleteTextView nameTxt;
public ArrayAdapter<String> adapter;
}
public class ListItem {
public String name;
public ListItem() {
name = "";
}
}
好的,上面这段代码是我到目前为止的代码,它可以完美地保存和加载来自文本视图的数据。
我认为您的方法 getView else 有误。你可以尝试以下 变化
holder=(viewHolder) View.getTag();
来自
holder = view;
然后出这个类型else
ViewHolder item = (ViewHolder) holder.getTag();
...
我找到了完成这个任务的方法。我在 ListView (ListView1) 中放置了一个普通的 TextView,然后在 ListView1 之上创建了另一个 ListView (ListView2)。然后根据用户在 ListView1 中单击的项目,我将用户单击的 TextViewer 中的项目编号(位置)和文本传递给 ListView2,它可以在其中设置自身的上边距并过滤其结果。设置上边距会将其移动到用户单击的 TextView 下方。如果有人想要代码,请发表评论并更新答案。