android - 使用 RecyclerView 制作基于客户列表适配器 Android 的水平 ListView

标签 android android-layout listview android-recyclerview android-adapter

我正在尝试制作图片的水平 ScrollView ,并在每张图片上附加一个 OnClick 监听器,将用户发送到新网页。我已经很好地处理了垂直列表,但现在我希望它是水平的。我怎样才能做到这一点。 我试过像 Android 建议的那样使用 recyclerView,但我无法让它接受适配器。

它给我这个错误: 回收器 View 不能应用于 CustomeListAdpater,以及当我尝试添加 onClick 时它说它无法解析方法 setOnClickListern(anonymous android.widget.AdapterView.OnItemClickListener())

到目前为止,这是我所拥有的;

这是线性布局管理器

 LinearLayoutManager layoutManager= new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL, false);
    recyclerView = (RecyclerView)findViewById(R.id.promotionHolder);
    recyclerView.setLayoutManager(layoutManager);

这里是我将客户列表适配器分配给回收 View 的地方

 private void fillListView(ArrayList<ListItem> listData)
{
    final ListView listView = (ListView) findViewById(R.id.custom_list);
    listView.setAdapter(new CustomListAdapter(this, listData));
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        //here is a method to either send the user to the poduct page
        //or to the main page in the app
        //open a new activity and close this one down
        @Override
        public void onItemClick(AdapterView<?> a, View v, int position, long id) {
            ListItem promoData = (ListItem) listView.getItemAtPosition(position);
            //lest open up the corrisponding webpage
            Intent reDirect = new Intent();
            reDirect.setAction(Intent.ACTION_VIEW);
            reDirect.addCategory(Intent.CATEGORY_BROWSABLE);
            reDirect.setData(Uri.parse(promoData.getPathUrl()));
            String newUrl = Uri.parse(promoData.getPathUrl()).toString();
            if (newUrl.contains("http")) {
                startActivity(reDirect);
            } else {
                //if not do nothing
                Log.d("Path URL: ", " is null");
            }

        }
    });

    recyclerView.setAdapter(new CustomListAdapter(this, listData));
    recyclerView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        //here is a method to either send the user to the poduct page
        //or to the main page in the app
        //open a new activity and close this one down
        @Override
        public void onItemClick(AdapterView<?> a, View v, int position, long id) {
            ListItem promoData = (ListItem) listView.getItemAtPosition(position);
            //lest open up the corrisponding webpage
            Intent reDirect = new Intent();
            reDirect.setAction(Intent.ACTION_VIEW);
            reDirect.addCategory(Intent.CATEGORY_BROWSABLE);
            reDirect.setData(Uri.parse(promoData.getPathUrl()));
            String newUrl = Uri.parse(promoData.getPathUrl()).toString();
            if (newUrl.contains("http")) {
                startActivity(reDirect);
            } else {
                //if not do nothing
                Log.d("Path URL: ", " is null");
            }

        }
    });
}

我将原始的 Listview 保留在那里,因为它可以很好地作为我正在做的事情的一个例子。

这是我的xml文件

    <android.support.v7.widget.RecyclerView
    android:id="@+id/promotionHolder"
    android:layout_below="@+id/logout"
    android:layout_width="match_parent"
    android:layout_height="240dp"
    android:orientation="horizontal"
    android:layoutManager = "android.support.v7.widget.LinearLayoutManager"
    >


</android.support.v7.widget.RecyclerView>

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

public class CustomListAdapter  extends BaseAdapter{
private ArrayList<ListItem> listData;
private LayoutInflater layoutInflater;

public CustomListAdapter(Context context, ArrayList<ListItem> listData) {
    this.listData = listData;
    layoutInflater = LayoutInflater.from(context);
}

@Override
public int getCount() {
    return listData.size();
}

@Override
public Object getItem(int position) {
    return listData.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = layoutInflater.inflate(R.layout.list_row_layout, null);
        holder = new ViewHolder();
        holder.imageView = (ImageView) convertView.findViewById(R.id.thumbImage);
        holder.labelView = (TextView)convertView.findViewById(R.id.label);
        convertView.setTag(holder);

    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    ListItem newsItem = listData.get(position);
    //Check to see if there is a lable attached to the image
    if(newsItem.getLableTitle().equals("null"))
    {
        holder.labelView.setText("");

    }else
    {
        holder.labelView.setText(newsItem.getLableTitle());
    }

    if (holder.imageView != null) {
        new ImageDownloaderTask(holder.imageView).execute(newsItem.getUrl());
    }

    return convertView;
}

static class ViewHolder {
    ImageView imageView;
    TextView labelView;
}
}

这是 list_row_layout

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:minHeight="8dp"
android:padding="1dp"
android:background="#000000"
>


<ImageView
    android:id="@+id/thumbImage"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:background="#000000"

    />
<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/label"
    android:layout_below="@id/thumbImage"
    android:layout_marginTop="1dp"
    android:layout_centerHorizontal="true"
    android:textColor="#ffffff"
    android:textSize="8pt"
    />

最佳答案

RecyclerView 不提供#setOnItemClickListenerRecyclerView.Adapter 也不提供。

您应该在 Adapters onBindViewHolder 方法中安装点击监听器。因为我在上面看不到对该方法的任何引用,所以我认为您的 Adapter 尚未迁移到新的 RecyclerView 方法。

您可以引用互联网上的链接,例如https://www.binpress.com/tutorial/android-l-recyclerview-and-cardview-tutorial/156用于学习如何执行此操作。

关于android - 使用 RecyclerView 制作基于客户列表适配器 Android 的水平 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38909221/

相关文章:

android - 将android Facebook SDK添加到项目后的java.lang.NoClassDefFoundError和ClassNotFoundException

android - 在我的 Android 应用中拍照时,我从来没有得到 RESULT_OK,但照片在那里

wordpress - WooCommerce ListView

android - ListView 中的 StackOverflow - Android

android - MVVMCross 是否有办法在单击 ListView 上的 ImageButton 时更改选择器?

java - 从 URL 获取并显示一系列图像

安卓界面问题

java - 布局中的 Android 微调器

android - 在不同的 Activity 中使用 findviewbyid

c# - ListView : InvalidArgument = Value of '0' is not valid for 'index' 中的错误