【问题标题】:Start new Activity with onClick() in RecyclerView在 RecyclerView 中使用 onClick() 启动新 Activity
【发布时间】:2016-05-12 12:23:46
【问题描述】:

我想使用 onClick() 方法进入一个新的 Activity,但我的代码不起作用。你能提供一些建议吗?我对 recyclerView 有一些问题,因为它对我来说相当新。谢谢

public class FragmentOne extends Fragment {

        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            RecyclerView recyclerView = (RecyclerView) inflater.inflate(
                    R.layout.recycleview, container, false);
            ContentAdapter adapter = new ContentAdapter();
            recyclerView.setAdapter(adapter);

            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
            return recyclerView;
        }

        public class ContentAdapter extends RecyclerView.Adapter<ContentAdapter.ViewHolder> {
            private static final int LENGTH = 50;

            public ContentAdapter() {
            }

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

                public ViewHolder(LayoutInflater inflater, ViewGroup parent) {
                    super(inflater.inflate(R.layout.fragment_channel, parent, false));
                }

                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(getActivity(), ChannelDetailActivity.class);
                    startActivity(intent);
                }
            }

            @Override
            public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

                ViewHolder viewHolder = new ViewHolder (LayoutInflater.from(parent.getContext()), parent);
                return viewHolder;

            }

            @Override
            public void onBindViewHolder(ViewHolder holder, int position) {
            }

            @Override
            public int getItemCount() {
                return LENGTH;
            }
        }

    }

<?xml version="1.0" encoding="utf-8"?>

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/my_recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipToPadding="false"
    android:paddingBottom="16dp"
    android:paddingTop="16dp"
    android:scrollbars="vertical"
    android:elevation="5dp"
    android:fadingEdgeLength="@dimen/cardview_compat_inset_shadow"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

<?xml version="1.0" encoding="utf-8"?>



<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="360dp"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:layout_marginBottom="1dp"
    android:elevation="2dp"
    android:layout_gravity="center_horizontal"
    android:background="#FFFF">



    <ImageView
        android:id="@+id/user_image"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:scaleType="centerCrop"
        android:src="@drawable/userone" />

    <TextView
        android:id="@+id/user_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="16dp"
        android:layout_toRightOf="@+id/user_image"
        android:text="Chuck Reich"
        android:paddingBottom="3dp"
        android:textAppearance="?attr/textAppearanceListItem"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/user_desc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/user_name"
        android:layout_marginLeft="16dp"
        android:layout_toRightOf="@+id/user_image"
        android:textColor="#a9a9a9"
        android:ellipsize="end"
        android:singleLine="true"
        android:text="Horizon Media Studios"
        android:textAppearance="?attr/textAppearanceListItem"
        android:paddingBottom="2dp"
        android:textSize="14sp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="3928"
        android:paddingRight="18dp"
        android:id="@+id/textView2"
        android:textColor="#a9a9a9"
        android:textSize="12sp"
        android:layout_below="@+id/user_desc"
        android:layout_alignStart="@+id/user_desc" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="3402"
        android:id="@+id/textView3"
        android:textColor="#a9a9a9"
        android:textSize="12sp"
        android:layout_below="@+id/user_desc"
        android:layout_toEndOf="@+id/textView2" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="2354"
        android:paddingLeft="20dp"
        android:id="@+id/textView4"
        android:textColor="#a9a9a9"
        android:textSize="12sp"
        android:layout_below="@+id/user_desc"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

【问题讨论】:

  • 尝试使用getActivity 而不是getContext
  • 我试过了还是不行

标签: android android-activity android-recyclerview


【解决方案1】:

我找到了解决方案!:) 在 Recyclerview 中使用 ViewHolder 类中给出的 itemView 来处理项目点击有这种方式:

 public static class ViewHolder extends RecyclerView.ViewHolder {
        public ViewHolder(LayoutInflater inflater, ViewGroup parent) {
            super(inflater.inflate(R.layout.fragment_channel, parent, false));
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Context context = v.getContext();
                    Intent intent = new Intent(context, ChannelDetailActivity.class);
                    context.startActivity(intent);
                }
            });
        }
    }

【讨论】:

  • 工作就像一个魅力。
【解决方案2】:

只需将getContext() 更改为v.getContext(),如下所示:

        @Override
        public void onClick(View v) {
           v.getContext().startActivity(new Intent(v.getContext(), ChannelDetailActivity.class));

        }

让您的 ViewHolder class 成为您的 ContentAdapter class 的内部类。

【讨论】:

【解决方案3】:

这对您参加其他活动非常有用

首先是回收器视图适配器:

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

final private ListItemClickListener mOnClickListener;
String[] mStrings;

public MainMenuRVAdapter(String[] tvStrings, ListItemClickListener listener) {
    mStrings = tvStrings;
    mOnClickListener = listener;
}

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

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.bind(position);
}

@Override
public int getItemCount() {
    return mStrings.length;
}

public interface ListItemClickListener {
    void onListItemClick(int clickedItemIndex);
}

class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView RowTV;

    public ViewHolder (View itemView) {
        super(itemView);
        RowTV = (TextView) itemView.findViewById(R.id.RowTextView);
        itemView.setOnClickListener(this);
    }

    void bind(int listIndex) {
        RowTV.setText(mListStrings[listIndex]);
    }

    @Override
    public void onClick(View v) {
        int clickedPosition = getAdapterPosition();
        mOnClickListener.onListItemClick(clickedPosition);
    }
}
}

然后是 MainActivity:

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener, MainMenuRVAdapter.ListItemClickListener {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    String[] stringsArray = getResources().getStringArray(R.array.mainStrings);

    RecyclerView rv = (RecyclerView) findViewById(R.id.RV);
    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    rv.setLayoutManager(layoutManager);
      rv.setAdapter(new MainMenuRVAdapter(stringsArray, this));
}
  @Override
public void onListItemClick(int clickedItemIndex) {
Intent mIntent;
switch (clickedItemIndex) {
 case 0: //first item in Recycler view
            mIntent = new Intent (MainActivity.this, x.class);
            startActivity(mIntent);
            break;
case 1: //second item in Recycler view
            mIntent = new Intent (MainActivity.this, y.class);
            startActivity(mIntent);
            break;
case 2: //third item in Recycler view
            mIntent = new Intent (MainActivity.this, z.class);
            startActivity(mIntent);
            break;
}

您可以使用此方法并将尽可能多的案例添加到 switch()。

希望我有所帮助。

【讨论】:

  • 如果有 100 个项目要显示,我们将在 switch() 中写入 100 个案例怎么办??
【解决方案4】:

只需将这几行代码放在 onClick(View view) 中

 view.getContext().startActivity(new 
 Intent(view.getContext(),SecondActivity.class));

【讨论】:

    【解决方案5】:

    你必须像这样创建 FragmentOne 的 构造函数

    Activity activity;
    FragmentOne(Acticity activity){ 
         this.activity = activity;
    }
    

    之后开始活动,像这样引用该活动

    activity.startActivity(intent);

    【讨论】:

      【解决方案6】:

      把你的逻辑改成这样:

          Context baseContext;
           public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                   Bundle savedInstanceState) {
      
                       //initial code
                       baseContext = getActivity();
          }        
          @Override
                  public void onClick(View v) {
                     Intent intent = new Intent(baseContext, ChannelDetailActivity.class));
                     startActivity(intent);
      
                  }
      

      【讨论】:

        【解决方案7】:
        context.startActivity( new Intent(context, DifferentActivity.class););
        

        在此处查看完整解决方案:How to open a different activity on recyclerView item onclick

        【讨论】:

          【解决方案8】:

          试试这个

          public class FragmentOne extends Fragment {
          
              @Nullable
              @Override
              public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                       Bundle savedInstanceState) {
                  RecyclerView recyclerView = (RecyclerView) inflater.inflate(
                          R.layout.recycleview, container, false);
                  ContentAdapter adapter = new ContentAdapter();
                  recyclerView.setAdapter(adapter);
          
                  recyclerView.setHasFixedSize(true);
                  recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
                  return recyclerView;
              }
          
              public class ContentAdapter extends RecyclerView.Adapter<ContentAdapter.ViewHolder> implements View.OnClickListener {
                  private static final int LENGTH = 50;
          
                  public ContentAdapter() {
                  }
          
                  public class ViewHolder extends RecyclerView.ViewHolder {
          
                      public ViewHolder(LayoutInflater inflater, ViewGroup parent) {
                          super(inflater.inflate(R.layout.fragment_channel, parent, false));
                      }
                  }
          
                  @Override
                  public void onClick(View v) {
                      Intent intent = new Intent(getActivity(), ChannelDetailActivity.class);
                      startActivity(intent);
                  }
          
                  @Override
                  public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
          
                      ViewHolder viewHolder = new ViewHolder(LayoutInflater.from(parent.getContext()), parent);
                      return viewHolder;
                  }
          
                  @Override
                  public void onBindViewHolder(ViewHolder holder, int position) {
                  }
          
                  @Override
                  public int getItemCount() {
                      return LENGTH;
                  }
              }
          }
          

          适配器现在实现了 onclick 而不是 viewholder。

          【讨论】:

          • 你好 MachoProgrammer。我似乎对回收站视图本身有问题,我认为可能需要在 xml 中添加一些内容
          • 您的日志中是否有任何错误或根本没有启动活动?
          • 我在 logcat 中没有任何错误,单击不起作用..当我单击项目时,它甚至没有显示动作(项目的颜色变化)
          【解决方案9】:

          根据 Naveen Yadav 的回答,对于使用 Kotlin 的人来说,这是一个不错的解决方案:

          val context = v.context
          val intent = Intent(context, SecondActivity::class.java)
          context.startActivity(intent)
          

          【讨论】:

            【解决方案10】:

            试试这个

             public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener    
             {
                public TextView tv_brandName,tv_priceValue;
                ImageView iv_item;
                RelativeLayout rl_share;
                public MyViewHolder(View view) 
                {
                    super(view);
                    tv_brandName=(TextView)view.findViewById(R.id.tv_brandName);
                    tv_priceValue=(TextView)view.findViewById(R.id.tv_priceValue);
                    iv_item=(ImageView)view.findViewById(R.id.iv_item);
                    rl_share=(RelativeLayout)view.findViewById(R.id.rl_share);
                    rl_share.setOnClickListener(new View.OnClickListener()
                    {
                        @Override
                        public void onClick(View v)
                         {
                          Context context = v.getContext();
                            Intent intent = new Intent(context, Share.class);
                            context.startActivity(intent);
                        }
                    });
                    context=view.getContext();
            
                }
             }
            

            }

            【讨论】:

              猜你喜欢
              • 2015-08-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-02-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多