ListView 项适配器无法单击

Posted

技术标签:

【中文标题】ListView 项适配器无法单击【英文标题】:ListView item adapter cannot click 【发布时间】:2019-02-22 22:56:45 【问题描述】:

我无法点击列表视图中的项目,这一切都是突然发生的。我已经为此工作了一周,但在此之前,它完全没有问题。我可以点击一个项目。

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) 
            Toast.makeText(getActivity(), list.get(i).getPassword(), Toast.LENGTH_SHORT).show();
        
);

CustomListAdapter adapter = new CustomListAdapter(getActivity(), R.layout.cardview_layout_locked, list);                            
listView.setAdapter(adapter);

这是我的 xml 文件。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
xmlns:design="http://schemas.android.com/apk/res-auto"
android:descendantFocusability="blocksDescendants"
tools:context=".LobbyFragment">

<RelativeLayout
    android:layout_
    android:layout_>

<ListView
        android:id="@+id/lobbieslistview"
        android:layout_
        android:layout_
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/textView"
        android:clickable="true"
        android:focusable="false"
        android:focusableInTouchMode="false" />
</RelativeLayout>
</FrameLayout>

这是我的自定义列表适配器

public class CustomListAdapter extends ArrayAdapter<cardviewTest> 

private static final String TAG = "CustomListAdapter";

private Context mContext;
private int mResource;
private int lastPosition = -1;

/**
 * Holds variables in a View
 */
private static class ViewHolder 
    TextView lobbyTextView, organizerTextView;
    ImageView image;


/**
 * Default constructor for the PersonListAdapter
 * @param context
 * @param resource
 * @param objects
 */

public CustomListAdapter(Context context, int resource, ArrayList<cardviewTest> objects) 
    super(context, resource, objects);

    mContext = context;
    //mResource = resource;


@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) 

    //sets up the image loader library
    setupImageLoader();

    //get the persons information
    String lobbyname = getItem(position).getLobbyname();
    String organizer = getItem(position).getOrganizer();
    String imgUrl = getItem(position).getImageURL();
    String password = getItem(position).getPassword();

    try


        //create the view result for showing the animation
        final View result;

        //ViewHolder object
        ViewHolder holder;

        if(convertView == null)

            if(!password.equals("") || password!=null) this.mResource = R.layout.cardview_layout_locked; 
            if(password.equals("") || password==null) this.mResource = R.layout.cardview_layout; 

            LayoutInflater inflater = LayoutInflater.from(mContext);
            convertView = inflater.inflate(mResource, parent, false);
            holder= new ViewHolder();
            holder.organizerTextView = (TextView) convertView.findViewById(R.id.organizerTV);
            holder.lobbyTextView = (TextView) convertView.findViewById(R.id.lobbynameTV);
            holder.image = (ImageView) convertView.findViewById(R.id.thumbnail);

            result = convertView;

            convertView.setTag(holder);
        
        else
            holder = (ViewHolder) convertView.getTag();
            result = convertView;
        


        Animation animation = AnimationUtils.loadAnimation(mContext,
                (position > lastPosition) ? R.anim.load_down_anim : R.anim.load_up_anim);
        result.startAnimation(animation);
        lastPosition = position;

        holder.organizerTextView.setText(organizer);
        holder.lobbyTextView.setText(lobbyname);

        //create the imageloader object
        ImageLoader imageLoader = ImageLoader.getInstance();

        int defaultImage = mContext.getResources().getIdentifier("@drawable/image_failed",null,mContext.getPackageName());

        //create display options
        DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true)
                .cacheOnDisc(true).resetViewBeforeLoading(true)
                .showImageForEmptyUri(defaultImage)
                .showImageOnFail(defaultImage)
                .showImageOnLoading(defaultImage).build();

        //download and display image from url
        imageLoader.displayImage(imgUrl, holder.image, options);

        return convertView;
    catch (IllegalArgumentException e)
        Log.e(TAG, "getView: IllegalArgumentException: " + e.getMessage() );
        return convertView;
    


/**
 * Required for setting up the Universal Image loader Library
 */
private void setupImageLoader()
    // UNIVERSAL IMAGE LOADER SETUP
    DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
            .cacheOnDisc(true).cacheInMemory(true)
            .imageScaleType(ImageScaleType.EXACTLY)
            .displayer(new FadeInBitmapDisplayer(300)).build();

    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
            mContext)
            .defaultDisplayImageOptions(defaultOptions)
            .memoryCache(new WeakMemoryCache())
            .discCacheSize(100 * 1024 * 1024).build();

    ImageLoader.getInstance().init(config);
    // END - UNIVERSAL IMAGE LOADER SETUP


我完全不知道我不能再点击项目的原因是什么。所有这些都只是突然发生的。这是工作,就在一个月前,然后,这发生了

【问题讨论】:

我建议你使用 RecyclerView 而不是 ListView 无法解决问题,但例如尝试在您的 Fragmnet 或活动中创建一个实现该接口的接口,然后在构造函数中将接口传递给适配器并在 convertView 上设置 Click 侦听器,并在 onlick 方法中调用该接口的方法 【参考方案1】:

首先,我会先设置Adapter 和其他东西,然后处理ListView 项目上的点击:

CustomListAdapter adapter = new CustomListAdapter(getActivity(), R.layout.cardview_layout_locked, list);                            
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) 
            Toast.makeText(getActivity(), list.get(i).getPassword(), Toast.LENGTH_SHORT).show();
        
);

另外,尝试将这两个设为true

android:focusable=“true”
android:focusableInTouchMode=“true”

那么我希望它应该可以工作。


另外,现在考虑使用RecyclerView

【讨论】:

还是一样,我不能按项目,还有其他想法吗?请帮忙 FrameLayout,您正在通过FrameLayout 和下面的列表显示Fragment。考虑在 MainActivity 布局中通过FrameLayout 显示Fragment(可以使用CoordinatorLayotFrameLayout),然后在Fragment 中使用ListView。所以,就目前而言,它实际上在 Fragment 之外。【参考方案2】:

在您的代码中没有发现错误,请检查CustomListAdapter 类文件以查看是否禁用项目。

已编辑 注意:

//download and display image from url
imageLoader.displayImage(imgUrl, holder.image, options);

以上几行比较耗时,会阻塞UI线程,不要放在CustomListAdapter里。

您可以创建一个界面。点击listview item时触发界面回调,并在回调中处理事情。有很多关于自定义适配器的示例,请谷歌。

【讨论】:

我无法在列表视图中选择一行,我不明白。这是突然发生的 新建一个干净的项目,或者发布 CustomListAdapter 代码。 我已经更新了我的问题并添加了我的 customlistadapter。请看一下

以上是关于ListView 项适配器无法单击的主要内容,如果未能解决你的问题,请参考以下文章

如何在适配器类中的列表视图项上获取动画?

适配器项目单击“从片段”

单击 ListView 上的删除按钮后删除 ListView 上的项目

在android studio中删除一个带有按钮的listview项目

适配器中的AutoCompleteTextView无法正常工作

从具有按钮的 ListView 获取列表项的位置