相关疑难解决方法(0)

为什么RecyclerView没有onItemClickListener()?

我正在探索RecyclerView,我很惊讶地看到RecyclerView它没有onItemClickListener().因为RecyclerView延伸

android.view.ViewGroup

ListView扩展

android.widget.AbsListView

.不过,我解决我的问题写onClick在我的RecyclerView.Adapter:

public static class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener {

    public TextView txtViewTitle;
    public ImageView imgViewIcon;

    public ViewHolder(View itemLayoutView) {
        super(itemLayoutView);
        txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.item_title);
        imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon);
    }

    @Override
    public void onClick(View v) {

    }
}
Run Code Online (Sandbox Code Playgroud)

但我仍然想知道为什么谷歌被删除了onItemClickListener()

是否有性能问题或其他问题?

java android android-recyclerview

940
推荐指数
17
解决办法
36万
查看次数

如何使用多种视图类型创建RecyclerView?

来自https://developer.android.com/preview/material/ui-widgets.html

当我们创建时,RecyclerView.Adapter我们必须指定ViewHolder将与适配器绑定.

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

    private String[] mDataset;

    public MyAdapter(String[] myDataset) {
        mDataset = myDataset;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView mTextView;
        public ViewHolder(TextView v) {
            super(v);
            mTextView = v;
        }
    }

    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.some_layout, parent, false);

        //findViewById...

        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.mTextView.setText(mDataset[position]);
    }

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

user-interface android android-recyclerview

795
推荐指数
13
解决办法
39万
查看次数

RecyclerView:如何清除缓存/回收的视图?

我使用RecyclerView显示具有列表布局的项目列表.我从列表布局切换到网格布局,在网格布局中仅显示所有数据的子集.此开关使用与列表布局呈现时不同的布局XML.

所有这一切都很好,除了当我滚动,回收(缓存?)列表布局视图填充网格,与适当的网格布局视图项混合.换句话说,我不是layout_grid.xml在RecyclerView 中使用my 为每个项目的layout_list.xml布局,而是使用布局获取项目,但是采用网格格式.

这告诉我LayoutManager工作正常,从列表切换到网格布局.但并非所有项目视图项都使用网格xml布局重新创建,而是使用回收列表布局视图.

我试过RecyclerView.removeAllViews(),RecyclerView.removeAllViewInLayout(),RecyclerView.swapAdapter()(强制适配器重装),都无济于事.

更新:

如果我在列表中向下滚动两个位置,然后从列表切换到网格,前两个位置不会通过onCreateViewHolder(),而是直接到onBindViewHolder(),因此不会强制使用网格布局xml.相反,前两个位置项目被回收(我认为)并以列表布局格式显示.

android recycler-adapter android-recyclerview

24
推荐指数
4
解决办法
3万
查看次数

根据打开的片段更改操作栏中的选项菜单图标

我的选项菜单中有这个项目:

<item
    android:id="@+id/opt_mnu_action"
    android:icon="@android:drawable/ic_dialog_info"
    android:orderInCategory="1"
    android:showAsAction="ifRoom"
    android:title="New">
</item>
Run Code Online (Sandbox Code Playgroud)

菜单本身在主FragmentActivity中创建.我想根据打开的Fragment以编程方式更改此项目的图标,显然,当用户点击此按钮时会有不同的操作.我尝试了几件事,但没有任何效果.我尝试的最后一件事是我的Fragment的onCreateView方法中的代码:

MenuItem mi = (MenuItem) view.findViewById(R.id.opt_mnu_action);
mi.setIcon(R.drawable.ico_1);
Run Code Online (Sandbox Code Playgroud)

但我的应用程序崩溃了.有没有办法做到这一点?

**更新**

以下是我现在要做的事情,所有这些都在我的主要主要FragmentActivity中:首先,我MenuItem action_button;在我的层次结构视图中有一个.然后在我的onCreateOptionsMenu方法中我实例化它:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);
    action_button = menu.findItem(R.id.opt_mnu_action);
    return super.onCreateOptionsMenu(menu);
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了这个函数来根据打开的标签更改图标:

public void change_action_button_icon(int tab_position)
{
    switch(tab_position)
    {
    case 0:
        action_button.setIcon(R.drawable.ico_1);
        break;
    case 1:
        action_button.setIcon(R.drawable.ico_2);
        break;
    case 2:
        action_button.setIcon(R.drawable.ico_3);
        break;
    }
    invalidateOptionsMenu();
}
Run Code Online (Sandbox Code Playgroud)

我用我的onTabSelected方法称它为:

public void onTabSelected(ActionBar.Tab tab,
        FragmentTransaction fragmentTransaction) {
    mViewPager.setCurrentItem(tab.getPosition());
    setTab_position(tab.getPosition());
    change_action_button_icon(tab.getPosition());
}
Run Code Online (Sandbox Code Playgroud)

但是一旦我开始我的应用程序 - …

icons android menuitem android-fragments android-optionsmenu

13
推荐指数
2
解决办法
3万
查看次数

单击 AlertDialog 项目列表时,在 RecyclerView 布局之间切换

我有 3 种不同的布局cardsListLayouttitleLayoutcardMagazineLayout将来可能会有更多,用作方法的视图onCreateViewHolder

我想在onCreateViewHolder方法中的视图之间切换,所以当用户从 AlertDialog 列表中选择时

这个 onOptionsItemSelected 在 MainActivity 那里有菜单项“更改布局”,以便当用户按下它时出现 AlertDialog 列表

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.change_layout) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle(getString(R.string.choose_layout));

            String[] layouts = {"Title Layout", "Cards List", "Card Magazine Layout"};
            builder.setItems(layouts, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int index) {
                    switch (index) {
                        case 0: // Title layout
                            Toast.makeText(MainActivity.this,
                                    "Title layout", Toast.LENGTH_LONG).show();
                            break;
                        case 1: // Cards List …
Run Code Online (Sandbox Code Playgroud)

android android-layout android-viewholder android-recyclerview recyclerview-layout

6
推荐指数
2
解决办法
3662
查看次数