【问题标题】:Android ListView does not respondAndroid ListView 没有响应
【发布时间】: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 是否有任何可聚焦元素 - stackoverflow.com/questions/8955270/…
  • 好的。我解决了它,但它不是 xml 的问题。它有ImageButton 我需要在代码中setFocusable(false)。

标签: android listview android-listview adapter


【解决方案1】:

这可能与 - ListView items are not clickable. why? 重复

要解决此问题,您必须在 ListView/GridView 中没有任何可聚焦的项目。

所以对于 Buttons/ImageButtons 你必须设置:

android:focusable="false" 

如果您在 ListView/GridView 中有一个 ImageButton,您可以将其切换为 ImageView,因为该按钮无论如何都无法点击,这样您就不需要更改可聚焦性。

也如链接中所述的 fpr0001 所述,您也可以这样做:

这个答案对我有用:https://stackoverflow.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"。

    这应该可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 2014-09-30
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 1970-01-01
      相关资源
      最近更新 更多