【问题标题】:Access View in CardView from main activity从主要活动访问 CardView 中的视图
【发布时间】:2016-01-02 03:00:19
【问题描述】:

所以我做了多个不同的 CardView Layout 并放到 RecyclerView 中,每个 cardview 都有自己的类来处理视图。然后我在 MainActivity 中有一个浮动操作按钮,我想将它用作我的程序的启动器,但我无法访问其中一个卡片视图中的计时。那么如何从 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();
}

【问题讨论】:

    标签: java android android-recyclerview android-cardview


    【解决方案1】:
    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];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多