ListView 文本更改但适配器数据不更改
ListView text changing but not adapter data
我在 ListView
中添加了 3 件商品。每一项都说 "Test"。当我点击一个项目时,我清除了该项目的文本。但是,当我检查 "watches" 日志中的变量时,即使我删除了文本,该项目仍被命名为 "Test"。
观看日志:
adapter2.getItem(1) = {java.lang.String@830045070536}"Test"
list.getItemAtPosition(1) = {java.lang.String@830045070536}"Test"
我希望 ListView
得到更新并在点击后将项目设为空白
例如手表日志应该是这样的:
adapter2.getItem(1) = {java.lang.String@830045070536}""
list.getItemAtPosition(1) = {java.lang.String@830045070536}""
有人可以告诉我为什么会发生这种情况并提供解决方案吗?
已编辑代码
public class ListView2 extends Fragment {
ListView list;
ArrayAdapter<String> adapter2;
List<String> array_list;
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.listview2, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
array_list = new ArrayList<String>();
array_list.add("Test");
array_list.add("Test");
array_list.add("Test");
//Build Adapter
adapter2 = new ArrayAdapter<String>(getActivity(), R.layout.items, array_list);
//Configure the list view
list = (ListView) getActivity().findViewById(R.id.listview2);
list.setAdapter(adapter2);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
TextView txt = (TextView)view.findViewById(R.id.txt);
if(txt.getText().toString().equals("Test")) {
txt.setText("");
}else{
txt.setText("Test");
}
adapter2.notifyDataSetChanged();
}
});
}
}
在项目点击监听器上,您必须获取行的视图,使用该行对象并在该行中找到视图,即您的情况下的文本视图。将该视图的文本设置为空白,并更改该位置上的数据集项,以便视图和数据同步。这样就不需要更新整个列表,节省了时间。
如果以上任何一点不明白,请指出。
尝试直接更新 TextView 不是好方法。您可以使用 remove() 和 insert() 方法来更新您的 ArrayAdapter。作为参考,请查看 here ,
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
if(adapter2.getItem(position).equals("Test")) {
adapter2.remove("Test");
adapter2.insert("", position);
}else{
adapter2.remove("");
adapter2.insert("Test", position);
}
adapter2.notifyDataSetChanged();
}
});
更新
这是另一种更新 ArrayAdapter 的方法,无需删除和插入条目到您在评论中提到的相同位置。
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
if(arrayList.get(position).equals("Test")) {
arrayList.set(position, "");
}else{
arrayList.set(position, "Test");
}
adapter2.notifyDataSetChanged();
}
}
希望对你有用。
我在 ListView
中添加了 3 件商品。每一项都说 "Test"。当我点击一个项目时,我清除了该项目的文本。但是,当我检查 "watches" 日志中的变量时,即使我删除了文本,该项目仍被命名为 "Test"。
观看日志:
adapter2.getItem(1) = {java.lang.String@830045070536}"Test"
list.getItemAtPosition(1) = {java.lang.String@830045070536}"Test"
我希望 ListView
得到更新并在点击后将项目设为空白
例如手表日志应该是这样的:
adapter2.getItem(1) = {java.lang.String@830045070536}""
list.getItemAtPosition(1) = {java.lang.String@830045070536}""
有人可以告诉我为什么会发生这种情况并提供解决方案吗?
已编辑代码
public class ListView2 extends Fragment {
ListView list;
ArrayAdapter<String> adapter2;
List<String> array_list;
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.listview2, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
array_list = new ArrayList<String>();
array_list.add("Test");
array_list.add("Test");
array_list.add("Test");
//Build Adapter
adapter2 = new ArrayAdapter<String>(getActivity(), R.layout.items, array_list);
//Configure the list view
list = (ListView) getActivity().findViewById(R.id.listview2);
list.setAdapter(adapter2);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
TextView txt = (TextView)view.findViewById(R.id.txt);
if(txt.getText().toString().equals("Test")) {
txt.setText("");
}else{
txt.setText("Test");
}
adapter2.notifyDataSetChanged();
}
});
}
}
在项目点击监听器上,您必须获取行的视图,使用该行对象并在该行中找到视图,即您的情况下的文本视图。将该视图的文本设置为空白,并更改该位置上的数据集项,以便视图和数据同步。这样就不需要更新整个列表,节省了时间。
如果以上任何一点不明白,请指出。
尝试直接更新 TextView 不是好方法。您可以使用 remove() 和 insert() 方法来更新您的 ArrayAdapter。作为参考,请查看 here ,
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
if(adapter2.getItem(position).equals("Test")) {
adapter2.remove("Test");
adapter2.insert("", position);
}else{
adapter2.remove("");
adapter2.insert("Test", position);
}
adapter2.notifyDataSetChanged();
}
});
更新
这是另一种更新 ArrayAdapter 的方法,无需删除和插入条目到您在评论中提到的相同位置。
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
if(arrayList.get(position).equals("Test")) {
arrayList.set(position, "");
}else{
arrayList.set(position, "Test");
}
adapter2.notifyDataSetChanged();
}
}
希望对你有用。