Android ListView 没有响应
Posted
技术标签:
【中文标题】Android ListView 没有响应【英文标题】:Android ListView does not respond 【发布时间】:2015-06-06 00:47:33 【问题描述】:我对 ListView 和 Adapter 有疑问。 ListView setOnItemClickListener 和 setOnItemLongClickListener 没有响应,但 onScroll 工作正常。这是代码,你可能有我的解决方案......
提前致谢。
public class AFragment extends Fragment
View rootView;
ListView l;
public static AArrayAdapter adapter;
public AFragment()
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
rootView = inflater.inflate(R.layout.fragment_list, container, false);
return rootView;
@Override
public void onViewCreated(View view, Bundle savedInstanceState)
l = (ListView) rootView.findViewById(R.id.listView);
adapter = new AArrayAdapter(getActivity(), R.layout.list_item_adapter, new ArrayList<AString>());
l.setAdapter(adapter);
l.setOnItemLongClickListener(new OnItemLongClickListener()
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id)
//Toast doesn't work
return true;
);
aList();
l.setOnScrollListener(new OnScrollListener()
private int mLastFirstVisibleItem;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState)
//
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
if (mLastFirstVisibleItem < firstVisibleItem)
// working
if (mLastFirstVisibleItem > firstVisibleItem)
// working
mLastFirstVisibleItem = firstVisibleItem;
);
l.setOnItemClickListener(new OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
//Toast doesn't work
);
public void aList()
...
/***/
public class AArrayAdapter extends ArrayAdapter<AString>
private final Context context;
private List<AString> items;
public AArrayAdapter(Context context, int layoutResourceId, List<AString> items)
super(context, layoutResourceId, items);
this.context = context;
this.items = items;
@Override
public View getView(final int position, View convertView, final ViewGroup parent)
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View rowView = inflater.inflate(R.layout.list_item_adapter, parent, false);
AHolder holder = null;
holder = new AHolder();
holder.acc = items.get(position);
holder.id = (TextView) rowView.findViewById(R.id.idLine);
holder.name = (TextView) rowView.findViewById(R.id.firstLine);
holder.value = (TextView) rowView.findViewById(R.id.secondLine);
rowView.setTag(holder);
setupItem(holder);
final TextView tvId = (TextView) rowView.findViewById(R.id.idLine);
final ImageButton imageButton = (ImageButton) rowView.findViewById(R.id.icon);
return rowView;
private void setupItem(AccHolder holder)
holder.name.setText(holder.acc.getName());
holder.value.setText(holder.acc.getValue());
holder.id.setText(String.valueOf(holder.acc.getId()));
holder.removeButton = (ImageButton) rowView.findViewById(R.id.icon);
holder.removeButton.setTag(holder.account);
holder.removeButton.setFocusable(false); // <=========== :)
public class AHolder
AString account;
TextView id;
TextView name;
TextView value;
【问题讨论】:
您在监听器方法中没有任何代码,您是否尝试至少显示吐司? 这正是我尝试过的。 检查您的列表视图项 xml 是否有任何可聚焦元素 - ***.com/questions/8955270/… 好的。我解决了它,但它不是 xml 的问题。它有ImageButton
我需要在代码中setFocusable(false)
。
【参考方案1】:
这可能与 - ListView items are not clickable. why? 重复
要解决此问题,您必须在 ListView/GridView 中没有任何可聚焦的项目。
所以对于 Buttons/ImageButtons 你必须设置:
android:focusable="false"
如果您在 ListView/GridView 中有一个 ImageButton,您可以将其切换为 ImageView,因为该按钮无论如何都无法点击,这样您就不需要更改可聚焦性。
也如链接中所述的 fpr0001 所述,您也可以这样做:
这个答案对我有用:https://***.com/a/16536355/5112161
主要是他在LinearLayout或RelativeLayout中添加了以下内容:
android:descendantFocusability="blocksDescendants"
您还需要从所有 xml 中删除以下内容:
android:focusable="false" android:focusable="true" android:clickable="true" android:clickable="false"
【讨论】:
【参考方案2】:如果您的行中有可点击的视图、按钮或复选框,最好使用Recyclerview。那将是更好的选择。您可以找到 Recyclerview here 的基本实现。
按钮或复选框单击侦听器会干扰列表视图单击侦听器。在行的根元素中
添加android:descendantFocusability="beforeDescendants"
、android:descendantFocusability="blocksDescendants"
之一
还可以尝试为按钮添加android:focusable="false"
。
这应该可以解决问题。
【讨论】:
以上是关于Android ListView 没有响应的主要内容,如果未能解决你的问题,请参考以下文章
ListView OnItemClickListener 没有响应?