Android ListView中的意外行为
我是Android编程新手。我打算使用ListView制作一个购物清单,这样用户就可以浏览清单上他所购买的物品。应该是这样的Android ListView中的意外行为,android,performance,android-studio,Android,Performance,Android Studio,我是Android编程新手。我打算使用ListView制作一个购物清单,这样用户就可以浏览清单上他所购买的物品。应该是这样的 名单已经列出来了 他能把买来的东西一览无余 他可以使用编辑文本和布局底部的添加按钮添加项目 列表是在添加项目后呈现的,如第3点上的项目,并保持笔划通过项目 在开始时,我单击我在程序中添加的许多初始项,然后开始添加项,列表中出现意外行为。一些新添加的项目在我从一开始就单击ADD(添加),而我甚至没有单击它们以使它们通过一个笔划后,就通过了一个笔划。他们中的一些人没有。我不理
ArrayList<String> shoppingList = new ArrayList<>();;
ArrayList<String> strikeThroughList = null;
ArrayList<String> strikeThroughText = null;
ArrayAdapter<String> adapter = null;
ListView lv = null;
Button addBtn=null;
EditText addEdtTxt=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addBtn=findViewById(R.id.addBtn);
addBtn.setOnClickListener(this::btnClick);
//shoppingList = new ArrayList<>();
strikeThroughList = new ArrayList<>();
strikeThroughText= new ArrayList<>();
//One way to populate List
Collections.addAll(shoppingList, "Eggs", "Yogurt", "Milk", "Bananas", "Apples", "Tide with bleach", "Cascade");
adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, shoppingList);
lv = (ListView) findViewById(R.id.listView);
lv.setAdapter(adapter);
lv.setOnItemClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.mnu,menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id=item.getItemId();
if(id==R.id.clrList)
{
shoppingList.clear();
lv.setAdapter(adapter);
}
return super.onOptionsItemSelected(item);
}
public void btnClick(View view) {
if(view.getId()==R.id.addBtn){ addEdtTxt=findViewById(R.id.addEdtTxt);
adapter.add(addEdtTxt.getText().toString());
adapter.notifyDataSetChanged();
}
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
TextView text = (TextView) view;
text.setPaintFlags(text.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
}
ArrayList shoppingList=new ArrayList();;
ArrayList删除线列表=null;
ArrayList StrikethrawText=null;
ArrayAdapter适配器=空;
ListView lv=null;
按钮addBtn=null;
EditText addEdtTxt=null;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addBtn=findviewbyd(R.id.addBtn);
addBtn.setOnClickListener(this::btnClick);
//shoppingList=newarraylist();
删除线列表=新的ArrayList();
删除线文本=新的ArrayList();
//填充列表的一种方法
收藏。addAll(购物清单,“鸡蛋”、“酸奶”、“牛奶”、“香蕉”、“苹果”、“漂白粉潮水”、“级联”);
adapter=new ArrayAdapter(这个,android.R.layout.simple\u list\u item\u 1,shoppingList);
lv=(ListView)findViewById(R.id.ListView);
低压设置适配器(适配器);
lv.setOnItemClickListener(本);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.mnu,menu);
返回super.onCreateOptions菜单(菜单);
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
int id=item.getItemId();
if(id==R.id.clrList)
{
shoppingList.clear();
低压设置适配器(适配器);
}
返回super.onOptionsItemSelected(项目);
}
公共无效BTN单击(视图){
if(view.getId()==R.id.addBtn){addEdtTxt=findViewById(R.id.addEdtTxt);
add(addedTXT.getText().toString());
adapter.notifyDataSetChanged();
}
}
@凌驾
公共虚线单击(AdapterView AdapterView,视图视图,内部位置,长l){
TextView text=(TextView)视图;
text.setPaintFlags(text.getPaintFlags()| Paint.STRIKE_-THRU_-text_-FLAG);
}
在将视图添加到删除线视图列表时,尝试更改以下代码
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
//String selectedFromList = (String)(lv.getItemAtPosition(position));
TextView text = (TextView) view;
text.setPaintFlags(text.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
text.setId(2);
strikeThroughView.add(text);
}
@覆盖
公共虚线单击(AdapterView AdapterView,视图视图,内部位置,长l){
//字符串selectedFromList=(字符串)(lv.getItemAtPosition(位置));
TextView text=(TextView)视图;
text.setPaintFlags(text.getPaintFlags()| Paint.STRIKE_-THRU_-text_-FLAG);
setId(2);
删除线粗糙视图。添加(文本);
}
这是什么原因导致的lv.getChildAt(3)
?你为什么用这个?您需要的是一个。我想在ListView中获取子视图,并与strokeThroughViews中已遍历并保存的视图进行比较。如果观点一致,那么我再敲一遍。我这样做是因为我发现,每次我在添加一个项目后单击ADD,然后调用方法btnClick(View View),初始笔划就会消失。如果您知道AdapterView
的工作原理,则不应在AdapterView
中使用getChildAt
。但是当您将新视图添加到删除视图时,您没有添加新视图及其对其他视图的引用。以及如何检查视图id,因为您已将id设置为“添加视图”。所以id必须分配给它自己。谢谢ADM和Chetan。我认为下面给出的Chetans代码是一个合适的解决方案,因为它将笔划粘贴到视图上,并为其提供了一个id,以便稍后在代码和Chetan中进行比较。如何在运行时动态生成id?您可以生成一些随机数。你好,Chetan,我编辑了我的问题。请你看一下好吗