标签: recycler-adapter

单击RecyclerView列表项

我有RecyclerView一个LinearLayoutManagerAdapter:

@Override public int getItemViewType(int position) {
    return position == 0? R.layout.header : R.layout.item;
}
Run Code Online (Sandbox Code Playgroud)

这是header.xml:

<View xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/header"
      android:layout_width="match_parent"
      android:layout_height="@dimen/header_height"
    />
Run Code Online (Sandbox Code Playgroud)

我想要实现的是在我可以点击的地方找到一个.我尝试了很多组合以下属性无济于事:RecyclerViewRecyclerView

      android:background="@android:color/transparent"
      android:background="@null"
      android:clickable="false"
      android:focusable="false"
      android:focusableInTouchMode="false"
      android:longClickable="false"
Run Code Online (Sandbox Code Playgroud)

如何让列表中的第一个项目透明(允许触摸事件到它后面的任何东西),但让它仍然占据空间?

android android-layout android-listview recycler-adapter android-recyclerview

8
推荐指数
1
解决办法
2213
查看次数

如何在onClick上更改RecyclerView项的viewType

我创建了一个带有Cards作为其主要视图类型的RecyclerView.我想要实现的是当用户点击某个项目时,该项目的ViewType从卡片更改为另一个Viewtype(例如,列表文本视图可以水平滚动).

我的RecyclerView适配器代码如下:

在下面的代码中,我创建了一个枚举类型的arrraylist来跟踪recyclerview中每一行的点击状态,然后我得到了我的数据集的大小,并用SHOW_PRIMARY_CONTENT为每一行初始化了我的arraylist

public class DisplayItemsAdapter extends RecyclerView.Adapter<DisplayItemsAdapter.ViewHolder> {

private static ArrayList<clickedState> itemClickedState;
private enum clickedState {
    SHOW_PRIMARY_CONTENT,
    SHOW_SECONDARY_CONTENT
}

private ArrayList<ItemData> mDataset = new ArrayList<>();

public DisplayItemsAdapter(ArrayList<ItemData> dataset) {
    mDataset = dataset;
    itemClickedState = new ArrayList<>();
    for (int i = 0; i < mDataset.size(); i++) {
        itemClickedState.add(i, clickedState.SHOW_PRIMARY_CONTENT);
    }
}
Run Code Online (Sandbox Code Playgroud)

下面是我的ViewHolder类,它包含对我所有子视图的引用,它实现了View.OnClickListener.为什么它实现View.OnClickListener是为了能够在单击状态之间切换以相应地更改viewTypes.

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    TextView tvItemName;
    TextView tvItemNumber;

    public ViewHolder(View itemView) {
        super(itemView);

        tvItemName = (TextView) itemView.findViewById(R.id.tvItemName);
        tvItemNumber = (TextView) itemView.findViewById(R.id.tvItemNumber);

        tvTicketClass = …
Run Code Online (Sandbox Code Playgroud)

android recycler-adapter android-recyclerview

8
推荐指数
1
解决办法
6401
查看次数

RecyclerView使用notifyItemMoved()破坏视图

我在使用该notifyItemMoved()方法时遇到问题.它似乎错误地显示无动于衷的视图.

我的清单中有4个元素.我想要做的是动画项目1和项目3之间的交换.项目1和3交换正确,但项目2显示项目3的内容!

所以列表开始看起来像这样:

Item 0
Item 1
Item 2
Item 3
Run Code Online (Sandbox Code Playgroud)

并以此结束:

Item 0
Item 3
Item 3 <!-- What the heck has this changed for?
Item 1
Run Code Online (Sandbox Code Playgroud)

我的适配器由a支持List mProductList.我调用以下代码:

public void sortBackingListUsingSortingList(List<ProductWrapper> newProductItems) {
    Log.e("", "Before:");
    for(ProductWrapper wrapper : mProductItems) wrapper.log();
    for(int i = 0; i < newProductItems.size(); i++) {
        ProductWrapper currentItem   = mProductItems.get(i);
        ProductWrapper correctItem   = newProductItems.get(i);

        if(!currentItem.equals(correctItem)) {
            // Item in wrong place
            int indexOfCorrectItem = getIndexOfItemInList(mProductItems, correctItem);
            Collections.swap(mProductItems, i, indexOfCorrectItem);
            notifyItemMoved(i, indexOfCorrectItem); …
Run Code Online (Sandbox Code Playgroud)

android recycler-adapter android-recyclerview

8
推荐指数
1
解决办法
6463
查看次数

在Recyclerview适配器上设置notifyDataSetChanged()

我正在为RecyclerView实现无休止的数据加载.当软件检测到将显示最后一个项目时,它会下载新项目并调用该loadMoreData()函数,但不会显示新数据集.

当我打电话时notifyDataSetChanged(),没有什么事情发生.

我只有一个刷新视图的解决方案是再次设置适配器,但问题是recyclerview返回到第一个位置然后再次recyclelerview从第一个位置向上滚动到最后一个位置.

RecyclerViewActivity.java

    RecyclerView rv;

    DatabaseHelpr databaseHelpr;

    RVAdapter adapter;

    LocationFinder locationfinder;

    Location currentLocation;

    ArrayList<ServiceModel> childList, list;

    private int MainService_ID, city_id;

    String url2;

    ActionBar actionBar;

    JSONArray items = null;

    Utility utility;

    Double lat, longi;

    LinearLayoutManager llm;

    int counter=0;

    ProgressBar progressBar;

    private static final String TAG_ITEMS = "items";

    private static final String TAG_LOCALITY = "Locality";

    private static final String TAG_BUSINESS_ID = "Business_Id";

    private static final String TAG_LONGITUDE = "Longitude";

    private static final String TAG_BUSINESS_NAME = "Business_Name";

    private …
Run Code Online (Sandbox Code Playgroud)

android notifydatasetchanged endlessscroll recycler-adapter android-recyclerview

8
推荐指数
1
解决办法
4万
查看次数

notifyItemChanged(int position)更新RecyclerView中的多个项目

我使用RecyclerView显示项目列表,我需要按位置更新单个项目的状态.我正在更新列表中的项目然后调用notifyItemChanged(int position),如下所示:

myList.set(position, newModifiedItem);
notifyItemChanged(position);
Run Code Online (Sandbox Code Playgroud)

该项目已成功更新,但也会随机更新其他项目,每次我在项目列表中向上和向下滚动时,此更新(不同的图标状态)也会在其他项目上进行.

我正在进行更改onBindViewHolder,我按位置检查列表项目并决定设置不同的状态.

完整适配器代码:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private List<MyObj> myList;

    public MyAdapter(List<MyObj> list) {
        this.myList = list;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_item, parent, false);
        return new ViewHolder(view);
    }

    public void onBindViewHolder(final ViewHolder holder, final int position) {
        MyObj myObj = myList.get(position);
        boolean isSpecial = myObj.getMySpecialStatus();

        holder.myItemTitle.setText(myObj.getTitle());

        //decide if item has different icon state
        if (isSpecial) {
            holder.myItemIcon.setImageResource(R.drawable.ic_special);    
        } 
    }

    @Override
    public …
Run Code Online (Sandbox Code Playgroud)

android recycler-adapter android-recyclerview

8
推荐指数
1
解决办法
4797
查看次数

奇怪的Android RecyclerView(GridLayoutManager)焦点行为

我有一个带有GridLayoutManager的RecyclerView,每行有2列.因为开发适用于Android TV,所以我需要专注于导航.

在此输入图像描述

如果我使用向下键导航到任何可见项目,这没关系.例如,项目1 - >项目3 - >项目5 - >项目7(仅部分可见.).但是当我再次按下键时,焦点将转移到第10项而不是9.

在此输入图像描述

我的网格视图适配器是:

public class GridAdapter extends RecyclerView.Adapter<GridAdapter.ViewHolder> {    
    private ArrayList<String> mDataset;

    public GridAdapter(ArrayList<String> myDataset) {
        mDataset = myDataset;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.grid_item, viewGroup, false);
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.txtTitle.setText(mDataset.get(position));    
    }

    @Override
    public int getItemCount() {
        return mDataset.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {

        public TextView txtTitle;
        public ViewHolder(View v) …
Run Code Online (Sandbox Code Playgroud)

android android-tv recycler-adapter

7
推荐指数
1
解决办法
2940
查看次数

使用GridLayoutManager的RecyclerView

装饰RecyclerView以获得这样的外观和感觉的最佳和最简单的方法是什么?我正在开发一个旅行座位预订应用程序...我知道我可以使用gridlayout管理员的recyclerview来做这件事但是应该是什么步骤我不知道有一件事要注意每辆巴士有不同的座位安排

在此输入图像描述

在此输入图像描述

在此输入图像描述

android android-gridlayout gridlayoutmanager recycler-adapter android-recyclerview

7
推荐指数
1
解决办法
2275
查看次数

在RecyclerView中更改不同视图的布局管理器

我实现了一个可扩展的recyclerview,其子元素是列表的一部分.我按照这个代码.这是它的工作原理,

使用RecyclerView实现ExpandableListView简要描述如下.列表模型有一个附加参数"type",用于标识项目是标题还是子项.通过检查此参数,适配器会扩展与该类型对应的视图和视图.如果类型是HEADER,它将膨胀标题项的布局,其中包含TextView和ImageView,用于指示子树是否展开.

现在,我想要做的是使扩展的布局成为网格.我通常会通过将布局管理器设置为GridLayoutManager来实现这一点,但在这种情况下,我只使用一个recyclerview,这意味着我无法在不更改标题的情况下更改布局管理器,最终导致整个recyclerview变为网格包括标题.

我的问题是:如何在适配器内仅为几个布局更改布局管理器?

编辑:我添加了一些代码.

Recyclerview适配器:

public class ExpandableListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

// These are constants that are used to determine if the item is a child or a header and is defined with each item from the data model
public static final int HEADER = 0;
public static final int CHILD = 1;

private List<Item> data;

public ExpandableListAdapter(List<Item> data) {
    this.data = data;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type) {
    View view = null;

    LayoutInflater …
Run Code Online (Sandbox Code Playgroud)

android android-layout recycler-adapter android-recyclerview

7
推荐指数
1
解决办法
6274
查看次数

带有动画的Android Recycler视图适配器过滤器

我正在尝试优化Android中的RecyclerView Adapter的过滤方法.该列表用作ArrayList.我看过这篇文章但他们每次都会从原始列表中过滤掉.

示例:如果字符串'a'有10个结果,则用户输入'm','am'结果是'a'结果的子集(results.size()<= 10).

我在这个问题上有三点要问,

  1. 我可以使用ArrayMap优化HashMap内存吗?我应该在String中使用逗号分隔位置而不是Integer对象数组或使用int原始数组的任何方式吗?
  2. 我没有在这个结果中得到任何动画,如何得到它?(我notifyItemInserted还在使用动画)
  3. 在Hashmap中应该保留多少数据,直到2个字符或者应该根据结果列表大小?
我很高兴知道除了这些要点之外,在这个代码中是否可以做得更好.

在下面的代码中,mList用于onBindViewHolder方法中.copyList始终包含所有数据(不对其进行插入或删除).

class MyFilter extends Filter {


        /**
         * 1. check do we have search results available (check map has this key)
         * 2. if available, remove all rows and add only those which are value for that key (string)
         * 3. else check do we have any key available starting like this, s=har, already available -ha then it can be reused
         *
         * @param constraint …
Run Code Online (Sandbox Code Playgroud)

android android-filterable recycler-adapter android-recyclerview

7
推荐指数
1
解决办法
1654
查看次数

使用FirestoreRecyclerAdapter时如何获取Firestore文档ID?

我正在使用Firestore存储一组"图表".我需要查询集合以获取具有登录用户ID的所有图表.我有一个FirebaseRecyclerAdapter,它显示了相应的图表(查询通过FirestoreRecyclerOptions传递).

但是,我需要访问每个图表的文档密钥,我无法弄清楚如何获取该信息.理想情况下,我想在从数据库中检索图表时将其设置为图表模型中的变量,但"地图"似乎没有提供将文档键映射到模型中的值的方法.如果不可能这样做,那么另一种解决方案就像在BindViewHolder中检索它并将其存储在一个不可见的视图中以便以后阅读.

在我的主要活动中,我有:

FirestoreRecyclerOptions<Chart> recyclerOptions = new FirestoreRecyclerOptions.Builder<Chart>()
                .setQuery(mChartsQuery, Chart.class)
                .build();

        mAdapter = new ChartListAdapter(recyclerOptions, this.getActivity());
Run Code Online (Sandbox Code Playgroud)

其中mChartsQuery获取具有特定用户ID的图表.

像这样创建一个图表(用户已在表单字段中输入'nameString'):

   Map<String, Object> newChart = new HashMap<>();
    newChart.put("uid", userId);
    newChart.put("name", nameString);

    mDatabase.collection("charts")
            .add(newChart)
            .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {...});
Run Code Online (Sandbox Code Playgroud)

我的ChartListAdapter类是:

public class ChartListAdapter
        extends FirestoreRecyclerAdapter<Chart, ChartViewHolder> {

    public ChartListAdapter(FirestoreRecyclerOptions recyclerOptions) {
        super(recyclerOptions);

    }

    @Override
    protected void onBindViewHolder(ChartViewHolder holder, int position, Chart model) {

        // THIS IS WHERE I NEED THE DOCUMENT ID, SO I CAN
        // PASS IT INTO THE INTENT AS EXTRA_CHART_KEY 

        // Set click …
Run Code Online (Sandbox Code Playgroud)

android firebase recycler-adapter google-cloud-firestore

7
推荐指数
1
解决办法
634
查看次数