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
(可以使用CoordinatorLayot
和FrameLayout
),然后在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项目