【问题标题】:RecyclerView starting intent from adapter according to position not workingRecyclerView 根据位置从适配器启动意图不起作用
【发布时间】:2015-12-09 05:44:28
【问题描述】:

我有一个带有 onClick 的工作 RecyclerView,带有回收站项目(视图)和一个复选框。但我的要求是根据我的适配器的 recyclerview 项目位置传递数据并在 onClick 中启动下一个活动。 但是当我在我的适配器中为意图编码时,它显示cannot resolve symbol。 以及我如何知道recyclerview 项目的位置。 请任何人帮助解决我的错误。

包含 Recyclerview 的 Fragment 类。

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.root5solutions.mirrealtors.R;
import com.example.root5solutions.mirrealtors.projectdatabase.HomeManager;


public class RecyclerTab1 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.home_tab1_recycler, container, false);
        RecyclerView rv = (RecyclerView) v.findViewById(R.id.home_recyclerview);
        LinearLayoutManager llm = new LinearLayoutManager(getContext());
        rv.setLayoutManager(llm);
        rv.setItemAnimator(new DefaultItemAnimator());
        rv.setHasFixedSize(true); // to improve performance
        rv.setAdapter(new HomeManager()); // the projectdatabase manager is assigner to the RV
  return v;
    }
}

RecyclerView 适配器

import android.graphics.Bitmap;
import android.support.design.widget.Snackbar;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.example.root5solutions.mirrealtors.R;
import java.util.Arrays;

public class HomeManager extends RecyclerView.Adapter<HomeManager.RecyclerViewHolder> {
 public static class RecyclerViewHolder extends RecyclerView.ViewHolder {

        TextView mProjectName, mProjectCity, mProjectType;
        ImageView mImage;
        CheckBox mCheck;
        RelativeLayout mProjectStatus;

        RecyclerViewHolder(View itemView) {
            super(itemView);
            mProjectName = (TextView) itemView.findViewById(R.id.PROJECT_name);
            mProjectCity = (TextView) itemView.findViewById(R.id.PROJECT_city);
            mProjectType = (TextView) itemView.findViewById(R.id.PROJECT_type);
            mImage = (ImageView) itemView.findViewById(R.id.PROJECT_image);
            mCheck = (CheckBox) itemView.findViewById(R.id.PROJECT_fav);
            mProjectStatus = (RelativeLayout) itemView.findViewById(R.id.label);
        }
    }
    private final View.OnClickListener mOnClickListener = new MyOnClickListener();
    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recyclerview_item, viewGroup, false);
        v.setOnClickListener(mOnClickListener);
        return new RecyclerViewHolder(v);
    }
    @Override
    public void onBindViewHolder(final RecyclerViewHolder viewHolder, int i) {
        // get the single element from the main array
 final HomeData projects = HomeData.PROJECTS[i];
        // Set the values
        viewHolder.mProjectName.setText(projects.get(HomeData.Field.NAME));
        viewHolder.mProjectCity.setText(projects.get(HomeData.Field.CITY));
        viewHolder.mProjectType.setText(projects.get(HomeData.Field.TYPE));
        viewHolder.mImage.setImageResource(projects.geti(HomeData.Field.IMAGE));
        viewHolder.mCheck.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                Snackbar snackbar = Snackbar.make(v, "Item Favorited", Snackbar.LENGTH_SHORT);
                                snackbar.show();
                            }
                        });
 }
                    @Override
                    public int getItemCount() {

                        return HomeData.PROJECTS.length;
                    }

    private class MyOnClickListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
//            Intent intent = new Intent(??, ProjectRecyclerDetailActivity.class);
//            intent.putExtra(ProjectRecyclerDetailActivity.ID, ProjectData.PROJECTs[position].getId());
//            startActivity(intent);
            Snackbar snackbar = Snackbar.make(v, "Item Clicked", Snackbar.LENGTH_SHORT);
            snackbar.show();
        }
    }
}

【问题讨论】:

  • 你应该创建一个具有上下文的构造函数......并且你可以在意图中使用该上下文
  • 如果你只是想知道位置然后在方法 onBindViewHolder(final RecyclerViewHolder viewHolder, int i) {......... i in signature代表位置.....跨度>

标签: android android-intent android-recyclerview


【解决方案1】:

在适配器中创建一个接口,如:

public interface mClickListener {
    public void mClick(View v, int position);
}

private static mClickListener listener;

public void setListner(mClickListener listner){
    this.listener = listner;
}

在viewHolder中:

    @Override
    public void onClick(View v) {
        listener.mClick(v, this.getLayoutPosition());
    }

在Activity中实现并覆盖方法为:

@Override
public void mClick(View v, int position) {
    Intent i = new Intent(ActivityOne.this, ActivityTwo.class);
    startActivity(i);
}

不要忘记将Listener设置为:

 YourAdapter.setListner(this);

【讨论】:

    【解决方案2】:

    您应该为HomeManagerMyOnClickListener 使用构造函数,然后您可以使用该上下文通过Intent 启动一个活动。

    您可以使用以下代码,它应该可以工作。

    1. HomeManager创建一个构造函数

      private Context mContext;
      
      public HomeManager(Context context){
      this.mContext=context;
      }
      
    2. MyOnClickListener中创建一个构造函数

      private class MyOnClickListener implements View.OnClickListener {
      private Context mContext;
      
      
      public MyOnClickListener(Context context) {
          this.mContext = context;
      
      }
      
      @Override
      public void onClick(View v) {
          Intent intent = new Intent( mContext,ProjectRecyclerDetailActivity.class);
          intent.putExtra(ProjectRecyclerDetailActivity.ID, ProjectData.PROJECTs[position].getId());
          startActivity(intent);
          //   Snackbar snackbar = Snackbar.make(v, "Item Clicked", Snackbar.LENGTH_SHORT);
          //   snackbar.show();
      }
      

      }

    3. 使用上下文创建MyOnClickListener 对象。

       private final View.OnClickListener mOnClickListener = new MyOnClickListener(mContext);
      
    4. 使用片段类中的活动上下文创建适配器对象

       rv.setAdapter(new HomeManager(getActivity()));
      

    【讨论】:

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