【发布时间】:2015-04-16 19:58:32
【问题描述】:
每次在 Android 中单击视图时都会出现系统视觉效果。在 Lollipop 中,这是连锁反应。当我创建一个 ListView 并将其关联到一个普通的 ArrayAdapter 时,这种效果就出现了。现在我已经添加了一个自定义的 ListView,这个效果就没有了。
现在,我试图找出问题所在,并且由于使用相同的列表项布局和默认适配器效果很好,我会说问题出在我的自定义适配器上。
我见过许多与此案例相关的解决方案,它们只是实现了调用一些可绘制对象的涟漪效应;这不是我想要做的。涟漪效果显示只是因为我在 Android 5 上运行该应用程序,现在我想做的是在我的项目被点击时为它们设置默认的系统突出显示效果。
以下是我的自定义适配器的(希望)相关部分:
public class CustomCardSetsAdapter extends BaseAdapter {
List<Card> totalList;
ArrayList<Boolean> hiddenItems;
ListView parentLV;
Integer curPosition = -1;
public static int selectedRowIndex;
public CustomCardSetsAdapter(CardSets cardList, ListView parentListView)
{
this.parentLV = parentListView;
assignSetValues(cardList);
totalList = cardList.getBlackrockMountain();
totalList.addAll(cardList.getClassic());
totalList.addAll(cardList.getCurseofNaxxramas());
totalList.addAll(cardList.getGoblinsvsGnomes());
Collections.sort(totalList,
new Comparator<Card>() {
public int compare(Card f1, Card f2) {
return f1.toString().compareTo(f2.toString());
}
});
hiddenItems = new ArrayList<>();
for (int i = 0; i < totalList.size(); i++) {
if(!totalList.get(i).getCollectible())
hiddenItems.add(true);
else
hiddenItems.add(false);
}
}
@Override
public int getCount() {
return (totalList.size() - getHiddenCount());
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
final int index = getRealPosition(position);
if(convertView == null) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
convertView = inflater.inflate(R.layout.card_list_item, parentLV, false);
}
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Integer prevPosition = curPosition;
curPosition = position;
if(prevPosition >= parentLV.getFirstVisiblePosition() &&
prevPosition <= parentLV.getLastVisiblePosition())
{
View view = parentLV.getChildAt(prevPosition- parentLV.getFirstVisiblePosition());
parentLV.getAdapter().getView(prevPosition,view, parentLV);
}
v.setBackgroundColor(Color.WHITE);
}
});
Card curCard = totalList.get(index);
TextView cardName = (TextView) convertView.findViewById(R.id.cardName);
cardName.setText(curCard.getName());
setRarityColor(curCard,cardName);
TextView manaCost = (TextView) convertView.findViewById(R.id.manaCost);
manaCost.setText((curCard.getCost()).toString());
ImageView setIcon = (ImageView) convertView.findViewById(R.id.setIcon);
setSetIcon(curCard,setIcon);
if(position == curPosition)
convertView.setBackgroundColor(Color.WHITE);
else
convertView.setBackgroundColor(Color.TRANSPARENT);
return convertView;
}
@Override
public int getItemViewType(int position) {
return R.layout.card_list_item;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public boolean isEmpty() {
return false;
}
private int getHiddenCount()
{
int count = 0;
for(int i = 0;i <totalList.size();i++)
if(hiddenItems.get(i))
count++;
return count;
}
private int getRealPosition(int position) {
int hElements = getHiddenCountUpTo(position);
int diff = 0;
for(int i=0;i<hElements;i++) {
diff++;
if(hiddenItems.get(position+diff))
i--;
}
return (position + diff);
}
private int getHiddenCountUpTo(int location) {
int count = 0;
for(int i=0;i<=location;i++) {
if(hiddenItems.get(i))
count++;
}
return count;
}
}
提前致谢。
【问题讨论】:
-
您将列表项背景颜色设置为白色。波纹是什么颜色的?
-
默认为灰色+深灰色。无论如何,在不改变单元格背景的情况下,效果仍然缺失。
-
您是否尝试过删除
View.OnClickListener并通过AdapterView.OnItemClickListener处理此问题? -
哇,我放了一个占位符 OnItemClickListener(一个简单的 Toast),现在单元格开始生效了。我回家后会仔细研究它。同时……你知道为什么会这样吗?
-
ListView 进行自己的触摸处理。如果你在行本身上设置了一个点击监听器,ListView 会假设你正在做你自己的触摸处理。
标签: android listview custom-adapter