我在布局中添加 ListView 时遇到一个问题。我在一个页面中实现了一个 ListView,我们在其中获取项目列表,因为当我们单击某个 ListMember 时,它会更改其颜色,再次单击它会将其更改为以前的颜色。现在想象一下,由于项目高度,一个屏幕可以容纳最大5 列表项目,下一位成员需要向下滚动才能看到。
现在假设 List 成员是
项目 1
项目 2
项目 3
项目 4
项目 5
项目 6
项目 7
在这些用途中,一次只能看到 5 个项目,现在当我点击“项目 1”(前五个成员中的第一个成员)时,它的颜色正在改变(比如从白色变为绿色)但是当我向下滚动时我看到 '项目 6'(前五个成员中的第一个成员)也更改了颜色(变为绿色),当我单击“项目 6”时,这次该成员的 setOnItemClickListener
被实际触发并尝试将其颜色更改为已更改的颜色。
这是 setOnItemClickListener
的代码:
productList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> a, View v, int position, long id) {
Log.i("imIn","Item Clicked");
v.animate();
if(listClicked[position]==0)
{
Log.i("***After*** ","Cyan Set ON");
v.setBackgroundColor(Color.parseColor("GREEN"));
listClicked[position]=1;
}
else if(listClicked[position]==1){
Log.i("***After*** ","Cyan Set OFF");
v.setBackgroundColor(Color.parseColor("WHITE"));
listClicked[position]=0;
}
}
});
AfterEdit::这是我的适配器
public class ProductListBaseAdapter extends BaseAdapter {
SharedPreferences sharedpreferences;
private static ArrayList<Product> searchArrayList;
private LayoutInflater mInflater;
ArrayList<TotalSelectedProduct> selectedProducts=new ArrayList<>();
final int[] listClicked;
public ProductListBaseAdapter(Context context, ArrayList<Product> totalProducts, int[] ClickedList) {
searchArrayList =totalProducts;
mInflater = LayoutInflater.from(context);
listClicked=ClickedList;
}
public int getCount() {
return searchArrayList.size();
}
public Object getItem(int position) {
return searchArrayList.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_list, null);
holder = new ViewHolder();
holder.txtItem = (TextView) convertView.findViewById(R.id.item_name);
holder.edit=(Button)convertView.findViewById(R.id.edit);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
/** I have tried inserting onClickListener in adapter also .but resulting same
*
holder.txtItem.setText(searchArrayList.get(position).getItemName());
final View.OnClickListener makeListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
v.animate();
if(listClicked[position]==0)
{
Log.i("***After*** ","Cyan Set ON");
v.setBackgroundColor(Color.parseColor("#ff2dbeff"));
listClicked[position]=1;
}
else if(listClicked[position]==1){
Log.i("***After*** ","Cyan Set OFF");
v.setBackgroundColor(Color.parseColor("#009933"));
listClicked[position]=0;
}
}
};
holder.txtItem.setOnClickListener(makeListener); */
return convertView;
}
static class ViewHolder {
TextView txtItem;
Button edit;
}
为什么会这样?
最佳答案
要执行您想要的操作,您必须向 ListView 添加一个适配器,并在其中控制每个项目的点击方法。
更新示例
public class ProductAdapter extends ArrayAdapter<Product> {
public PProductAdapter(Activity activity,
ArrayList<Product> products) {
super(activity, R.layout.item_product, products);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Product p = getItem(position);
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.item_product, parent,
false);
viewHolder.name = (TextView) convertView.findViewById(R.id.tvName);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
p.checked = !p.checked;
if (p.checked)
v.setBackgroundColor(Color.parseColor("#ff2dbeff"));
else
v.setBackgroundColor(Color.parseColor("#009933"));
}
});
viewHolder.name.setText(p.name);
return convertView;
}
private class ViewHolder {
TextView name;
}
}
public class Product{
public String name;
public boolean checked;
Product() {
name = "dummy name";
checked = false;
}
}
关于android - 我的 ListView 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31724783/