从 main activity 访问 CardView 中的视图

Access View in CardView from main activity

所以我制作了多个不同的 CardView 布局并将其放入 RecyclerView,每个 cardview 都有自己的 class 来处理视图。然后我在 MainActivity 中有一个浮动操作按钮,我想将它用作我的程序的启动器,但我无法访问其中一个 cardview 中的 chrono。那么我如何从 MainActivity 访问其中一个 CardView 中的视图 (Chrono)?

我已经尝试使用 mainactivity 中的 findviewbyid,但结果始终为 null,因为它可能尚未创建 recyclerview。

感谢您的帮助。

谢谢

CustomAdapter.java

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

private int[] mCardTypes;

public static final int TIME = 0;
public static final int MAP = 1;
public static final int COST = 2;

public static class ViewHolder extends RecyclerView.ViewHolder {
    public ViewHolder(View itemView) {
        super(itemView);
    }
}

public CustomAdapter(MainActivity main, int[] cardTypes) {
    this.main = main;
    mCardTypes = cardTypes;
}

public class ParkTimeViewHolder extends ViewHolder {
    Chronometer mTotalTime;
    Chronometer mRemainingTime;

    public ParkTimeViewHolder(View itemView) {
        super(itemView);
        this.mTotalTime = (Chronometer) itemView.findViewById(R.id.chrono_total);
        this.mRemainingTime = (Chronometer) itemView.findViewById(R.id.chrono_remaining);
      // i can only run choro.start() here
    }
}

public class MapViewHolder extends ViewHolder {
    //MapView

    public MapViewHolder(View itemView) {
        super(itemView);
        // TODO: 24-Dec-15 add map view
    }
}

public class CostViewHolder extends ViewHolder {
    TextView mCost;

    public CostViewHolder(View itemView) {
        super(itemView);
        this.mCost = (TextView) itemView.findViewById(R.id.text_view_cost);
        mCost.setText("20000");
    }
}


@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v;
    if (viewType == TIME) {
        v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.card_view_time, parent, false);
        return new ParkTimeViewHolder(v);
    } else if (viewType == MAP) {
        v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.card_view_map, parent, false);
        return new MapViewHolder(v);
    } else {
        v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.card_view_cost, parent, false);
        return new CostViewHolder(v);
    }
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    if(holder.getItemViewType() == TIME) {
        ParkTimeViewHolder myHolder = (ParkTimeViewHolder) holder;
    } else
    if(holder.getItemViewType() == MAP) {
        MapViewHolder myHolder = (MapViewHolder) holder;
    } else
    if(holder.getItemViewType() == COST) {
        CostViewHolder myHolder = (CostViewHolder) holder;
    }
}

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

@Override
public int getItemViewType(int position) {
    return mCardTypes[position];
}

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private RecyclerView mRecyclerView;
private CustomAdapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;

private Chronometer mTotalChrono;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    mRecyclerView = (RecyclerView) findViewById(R.id.recycle_view_main_activity);
    mLayoutManager = new LinearLayoutManager(MainActivity.this);
    mRecyclerView.setLayoutManager(mLayoutManager);
    mAdapter = new CustomAdapter(this, new int[]{CustomAdapter.TIME, CustomAdapter.COST});
    mRecyclerView.setAdapter(mAdapter);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(this);

}

@Override
public void onClick(View v) {
    if (v.getId() == R.id.fab) {
        Snackbar.make(v, "Started", Snackbar.LENGTH_LONG)
                .setAction("Action", null).show();
     // i need to run chrono.start(); from here
    }
}

@Override
protected void onStart() {
    super.onStart();
}
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {

private int[] mCardTypes;

public static final int TIME = 0;
public static final int MAP = 1;
public static final int COST = 2;
// create this variable
private static ParkTimeViewHolder parkTimeViewholder;

//call this function in mainactivity
public static void startChrono(){
    if(parkTimeViewholder!=null){
    // start chrono here using parkTimeViewholder variable
    }
}

public static class ViewHolder extends RecyclerView.ViewHolder {
    public ViewHolder(View itemView) {
        super(itemView);
    }
}

public CustomAdapter(MainActivity main, int[] cardTypes) {
    this.main = main;
    mCardTypes = cardTypes;
}

public class ParkTimeViewHolder extends ViewHolder {
    Chronometer mTotalTime;
    Chronometer mRemainingTime;

    public ParkTimeViewHolder(View itemView) {
        super(itemView);
        this.mTotalTime = (Chronometer) itemView.findViewById(R.id.chrono_total);
        this.mRemainingTime = (Chronometer) itemView.findViewById(R.id.chrono_remaining);
      // i can only run choro.start() here
    }
}

public class MapViewHolder extends ViewHolder {
    //MapView

    public MapViewHolder(View itemView) {
        super(itemView);
        // TODO: 24-Dec-15 add map view
    }
}

public class CostViewHolder extends ViewHolder {
    TextView mCost;

    public CostViewHolder(View itemView) {
        super(itemView);
        this.mCost = (TextView) itemView.findViewById(R.id.text_view_cost);
        mCost.setText("20000");
    }
}


@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v;
    if (viewType == TIME) {
        v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.card_view_time, parent, false);
        return new ParkTimeViewHolder(v);
    } else if (viewType == MAP) {
        v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.card_view_map, parent, false);
        return new MapViewHolder(v);
    } else {
        v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.card_view_cost, parent, false);
        return new CostViewHolder(v);
    }
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    if(holder.getItemViewType() == TIME) {
        ParkTimeViewHolder myHolder = (ParkTimeViewHolder) holder;
        //initiate parkTimeViewholder variable
        this.parkTimeViewholder = myHolder;
    } else
    if(holder.getItemViewType() == MAP) {
        MapViewHolder myHolder = (MapViewHolder) holder;
    } else
    if(holder.getItemViewType() == COST) {
        CostViewHolder myHolder = (CostViewHolder) holder;
    }
}

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

@Override
public int getItemViewType(int position) {
    return mCardTypes[position];
}