RecyclerView Adapter 系列(1):RecyclerView Array Adapter

现在,安卓开发者用RecyclerView替代了以前的ListView或GridView。RecyclerView控件是更高级和灵活的ListView版本。这个控件是显示大数据集的容器,只维持有限数量的view就可以高效地滚动。

遗憾的是,不像之前ListView那样,Google并没有给我们提供一个默认的Recycler View Adapter类来继承。我首先将讨论Recycer View Adapter,它可以轻松的将对象列表绑定到你的RecyclerView上。

import android.support.v7.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

public abstract class RecyclerViewArrayAdapter<T, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH>
{
    private final List<T> items;

    public void bindData(final List<T> items)
    {
        this.items = items;
        this.notifyDataSetChanged();
    }

    public final T getItem(final int position)
    {
        return this.items.get(position);
    }

    public List<T> getItems()
    {
        return items;
    }

    @Override
    public int getItemCount()
    {
        return this.items != null
                ? this.items.size()
                : 0;
    }

    @Override
    public final void onBindViewHolder(final VH holder, final int position)
    {
        final T item = this.getItem(position);
        this.onBindViewHolder(holder, item);
    }

    public abstract void onBindViewHolder(final VH holder, final T item);
}

这个类不难理解,也不包含大量的逻辑,而且它可以避免重复实现包含一个简单列表的Adapter类。

下面代码中你可以找到一个简单的Adapter,这个Adapter用来向一个RecyclerView中显示搜索结果。

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import butterknife.Bind;
import butterknife.ButterKnife;

public class SearchResultsAdapter extends RecyclerViewArrayAdapter<SearchResult, SearchResultsAdapter.SearchResultViewHolder>
    implements View.OnClickListener
{
    private final LayoutInflater layoutInflater;
    private OnItemClickListener onItemClickListener;

    public SearchResultsAdapter(final Context context)
    {
        super();

        this.layoutInflater = LayoutInflater.from(context);
    }

    public void setOnItemClickListener(final OnItemClickListener onItemClickListener)
    {
        this.onItemClickListener = onItemClickListener;
    }

    @Override
    public SearchResultViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType)
    {
        final View view = this.layoutInflater.inflate(R.layout.listitem_search, parent, false);
        view.setOnClickListener(this);

        return new SearchResultViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final SearchResultViewHolder holder, final SearchResult item)
    {
        holder.bindData(item);
    }

     /*
     * View.OnClickListener
     */

    @Override
    public void onClick(final View view)
    {
        if (this.onItemClickListener != null)
        {
            final RecyclerView recyclerView = (RecyclerView) view.getParent();
            final int position = recyclerView.getChildLayoutPosition(view);
            if (position != RecyclerView.NO_POSITION)
            {
                final SearchResult item = this.getItem(position);
                this.onItemClickListener.onItemClicked(item);
            }
        }
    }

    public static class SearchResultViewHolder extends RecyclerView.ViewHolder
    {
        @Bind(R.id.textview_name)
        TextView textViewName;

        public SearchResultViewHolder(final View itemView)
        {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }

        public void bindData(final SearchResult item)
        {
            this.textViewName.setText(item.getName());
        }
    }

    public interface OnItemClickListener
    {
        void onItemClicked(SearchResult item);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以按照以下步骤实现在 RecyclerViewAdapter 中实现删除数据库某张表的记录的点击事件: 1. 在 RecyclerViewAdapter 中,为需要响应点击事件的 View 设置 OnClickListener。 2. 在 OnClickListener 中,获取该 View 所在的数据项的位置。 3. 通过该位置获取该数据项的唯一标识。 4. 在点击事件中,调用数据库操作 API,删除该唯一标识对应的记录。 下面是 Kotlin 代码示例: ```kotlin class MyAdapter(private val dataSet: List<Data>, private val database: SQLiteDatabase) : RecyclerView.Adapter<MyAdapter.ViewHolder>() { class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { val textView: TextView = view.findViewById(R.id.textView) val deleteButton: Button = view.findViewById(R.id.deleteButton) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_layout, parent, false) return ViewHolder(view) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val data = dataSet[position] holder.textView.text = data.text holder.deleteButton.setOnClickListener { // 获取数据项的唯一标识 val id = data.id // 在数据库中删除该记录 database.delete("table_name", "id=?", arrayOf(id.toString())) // 刷新 RecyclerView dataSet.toMutableList().removeAt(position) notifyItemRemoved(position) notifyItemRangeChanged(position, dataSet.size) } } override fun getItemCount() = dataSet.size } ``` 在这个示例中,我们传入了一个 SQLiteDatabase 对象,它可以在 Adapter 中直接使用,用于执行数据库操作。在 onBindViewHolder 方法中,我们为 deleteButton 设置了 OnClickListener,并在其中获取了数据项的唯一标识 id,并使用该 id 删除了数据库中对应的记录。最后,我们还需要刷新 RecyclerView,以便删除后可以正确显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值